Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R函数,用于根据列之间的模式对行进行分组?_R_Tidyr - Fatal编程技术网

R函数,用于根据列之间的模式对行进行分组?

R函数,用于根据列之间的模式对行进行分组?,r,tidyr,R,Tidyr,我想根据跨列的每行模式对数据帧的行进行分组。这是一个非常简单的例子 df <- data.frame("gene" = 1:5, "stg 1" = c("up", "up", NA, NA, NA), "stg 2" = c("up", "up", NA, NA, NA),

我想根据跨列的每行模式对数据帧的行进行分组。这是一个非常简单的例子

 df <- data.frame("gene" = 1:5, 
                 "stg 1" = c("up", "up", NA, NA, NA),
                 "stg 2" = c("up", "up", NA, NA, NA),
                 "stg 3" = c("up", "up", NA, NA, NA),
                 "stg 4" = c("down", "down", "up", "up", NA))

> df
  gene stg.1 stg.2 stg.3 stg.4
1    1    up    up    up  down
2    2    up    up    up  down
3    3  <NA>  <NA>  <NA>    up
4    4  <NA>  <NA>  <NA>    up
5    5  <NA>  <NA>  <NA>  <NA>
df
基因stg.1 stg.2 stg.3 stg.4
1上下
2上下
3向上
向上
5    5        

在这种情况下,基因1和2将被分组,基因3和4将被分组。我想知道每个模式组中的基因名称,以及该组的模式是什么。我希望这是清楚的。提前谢谢

试试这种方法。使用
c_-overs()
toString()
创建一个变量以跨行收集值。之后,格式化为factor并指定后缀
组。
。这里的代码使用了
tidyverse
功能:

library(tidyverse)
#Code
dfnew <- df %>% group_by(gene) %>% 
  mutate(Var=toString(c_across(stg.1:stg.4))) %>%
  ungroup() %>%
  mutate(Var=paste0('Group.',as.numeric(factor(Var,levels = unique(Var),ordered = T))))
库(tidyverse)
#代码
dfnew%组由(基因)%>%
突变(Var=toString(c_跨(stg.1:stg.4))%>%
解组()%>%
变异(Var=paste0('Group'),as.numeric(因子(Var,levels=unique(Var),ordered=T)))
输出:

# A tibble: 5 x 6
   gene stg.1 stg.2 stg.3 stg.4 Var    
  <int> <fct> <fct> <fct> <fct> <chr>  
1     1 up    up    up    down  Group.1
2     2 up    up    up    down  Group.1
3     3 NA    NA    NA    up    Group.2
4     4 NA    NA    NA    up    Group.2
5     5 NA    NA    NA    NA    Group.3
# A tibble: 5 x 6
# Groups:   gene [5]
   gene stg.1 stg.2 stg.3 stg.4 Var             
  <int> <fct> <fct> <fct> <fct> <chr>           
1     1 up    up    up    down  up, up, up, down
2     2 up    up    up    down  up, up, up, down
3     3 NA    NA    NA    up    NA, NA, NA, up  
4     4 NA    NA    NA    up    NA, NA, NA, up  
5     5 NA    NA    NA    NA    NA, NA, NA, NA 
#一个tible:5 x 6
基因stg.1stg.2stg.3stg.4var
1上下组。1
2上下组。1
3不适用于不适用组
4不合格组
5 NA组
如果只需要图案,请尝试以下操作:

#Code 2
dfnew <- df %>% group_by(gene) %>% 
  mutate(Var=toString(c_across(stg.1:stg.4)))
#代码2
dfnew%组由(基因)%>%
突变(Var=toString(c_-cross(stg.1:stg.4)))
输出:

# A tibble: 5 x 6
   gene stg.1 stg.2 stg.3 stg.4 Var    
  <int> <fct> <fct> <fct> <fct> <chr>  
1     1 up    up    up    down  Group.1
2     2 up    up    up    down  Group.1
3     3 NA    NA    NA    up    Group.2
4     4 NA    NA    NA    up    Group.2
5     5 NA    NA    NA    NA    Group.3
# A tibble: 5 x 6
# Groups:   gene [5]
   gene stg.1 stg.2 stg.3 stg.4 Var             
  <int> <fct> <fct> <fct> <fct> <chr>           
1     1 up    up    up    down  up, up, up, down
2     2 up    up    up    down  up, up, up, down
3     3 NA    NA    NA    up    NA, NA, NA, up  
4     4 NA    NA    NA    up    NA, NA, NA, up  
5     5 NA    NA    NA    NA    NA, NA, NA, NA 
#一个tible:5 x 6
#组:基因[5]
基因stg.1stg.2stg.3stg.4var
向上向下向上,向上,向上,向下
向上向下向上,向上,向上,向下
不,不,不,不,不,不,不
不,不,不,不,不,不
5不,不,不,不,不

我们可以通过
unite

library(dplyr)
library(tidyr)
df %>% 
     unite(grp, starts_with('stg'), na.rm = TRUE, remove = FALSE) %>% 
     mutate(grp = match(grp, unique(grp)))
#  gene grp stg.1 stg.2 stg.3 stg.4
#1    1   1    up    up    up  down
#2    2   1    up    up    up  down
#3    3   2  <NA>  <NA>  <NA>    up
#4    4   2  <NA>  <NA>  <NA>    up
#5    5   3  <NA>  <NA>  <NA>  <NA>
库(dplyr)
图书馆(tidyr)
df%>%
unite(grp,以('stg')开头,na.rm=TRUE,remove=FALSE)%>%
变异(grp=match(grp,unique(grp)))
#基因组stg.1 stg.2 stg.3 stg.4
#1上下
#2 2 1向上向下
#3 3 2向上
#4 4 2向上
#5    5   3        

虽然没有特别要求,
数据。表
解决方案如下


library(data.table)
setDT(df)
df[,group:= paste0(stg.1,stg.2,stg.3,stg.4),by= gene][,group:= match(group, unique(group))]

> df
   gene stg.1 stg.2 stg.3 stg.4 group
1:    1    up    up    up  down     1
2:    2    up    up    up  down     1
3:    3  <NA>  <NA>  <NA>    up     2
4:    4  <NA>  <NA>  <NA>    up     2
5:    5  <NA>  <NA>  <NA>  <NA>     3

库(数据表)
setDT(df)
df[,group:=paste0(stg.1,stg.2,stg.3,stg.4),by=基因][,group:=match(group,unique(group))]
>df
基因stg.1 stg.2 stg.3 stg.4组
1:1上升上升下降1
2:2上下1
3:3上升2
4:4上升2
5:    5             3