簡體   English   中英

用於根據跨列模式對行進行分組的 R 函數?

[英]R function for grouping rows based on patterns across columns?

我想根據每列跨列的模式對數據框的行進行分組。 這是一個非常簡單的例子。

 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>

在這種情況下,基因 1 和 2 將被分組,基因 3 和 4 將被分組。 我想要每個模式組中基因的名稱,以及該組的模式是什么。 我希望這很清楚。 提前致謝!

試試這個方法。 創建一個變量以使用c_across()toString() c_across()收集值。 之后,格式化為因子並分配后綴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, 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 

我們可以通過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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM