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