如何解决R函数可以根据跨列的模式对行进行分组?
我想根据跨列的每一行的模式对数据框的行进行分组。这是一个非常简单的示例。
df <- data.frame("gene" = 1:5,"stg 1" = c("up","up",NA,NA),"stg 2" = c("up","stg 3" = c("up","stg 4" = c("down","down",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>
在这种情况下,基因1和2将被分组,而基因3和4将被分组。我想要每个模式组中的基因名称,以及该模式的模式。我希望这很清楚。预先感谢!
解决方法
尝试这种方法。创建一个变量以使用c_across()
和toString()
跨行收集值。之后,将格式设置为factor并分配后缀Group.
。下面是使用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))))
输出:
# 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
如果只需要一种模式,请尝试以下操作:
#Code 2
dfnew <- df %>% group_by(gene) %>%
mutate(Var=toString(c_across(stg.1:stg.4)))
输出:
# 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,down
2 2 up up up down up,down
3 3 NA NA NA up NA,NA,up
4 4 NA NA NA up NA,up
5 5 NA NA NA NA NA,NA
,
我们可以使用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>
,
尽管没有特别要求,data.table
解决方案如下
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。