【问题标题】:How to reclassify and merge multiple columns of a dataframe according to the colnames classification in another dataframe using R?如何使用 R 根据另一个数据框中的 colnames 分类对数据框的多个列进行重新分类和合并?
【发布时间】:2021-08-24 08:51:37
【问题描述】:

我有两个数据框,一个包含不同分类的多列 (df1),另一个包含 colname 分类 (df2)。

df1
          TP53 PIK3CA  PTEN   NF1 SMAD4 ERBB3
X1800018 FALSE  FALSE FALSE FALSE FALSE FALSE
X1800021  TRUE   TRUE FALSE  TRUE FALSE FALSE
X1800026 FALSE  FALSE  TRUE FALSE FALSE FALSE
X1800027  TRUE  FALSE FALSE FALSE FALSE  TRUE
X1800028 FALSE   TRUE  TRUE FALSE FALSE FALSE
X1800029  TRUE   TRUE FALSE FALSE FALSE FALSE

df2
      Gene Pathway
1    ERBB3       A
2      NF1       A
3   PIK3CA       B
4     PTEN       B
5    SMAD4       C
6     TP53       D

我想根据df2对同分类的df1列进行重新分类合并。

df3
                 D      B     A     C     
    X1800018 FALSE  FALSE FALSE FALSE
    X1800021  TRUE   TRUE  TRUE FALSE
    X1800026 FALSE   TRUE FALSE FALSE
    X1800027  TRUE  FALSE  TRUE FALSE
    X1800028 FALSE   TRUE FALSE FALSE
    X1800029  TRUE   TRUE FALSE FALSE

数据

df1

structure(c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, 
FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, 
FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE
), .Dim = c(6L, 6L), .Dimnames = list(c("X1800018", "X1800021", 
"X1800026", "X1800027", "X1800028", "X1800029"), c("TP53", "PIK3CA", 
"PTEN", "NF1", "SMAD4", "ERBB3")))

df2

structure(list(Gene = c("ERBB3", "NF1", "PIK3CA", "PTEN", "SMAD4", 
"TP53"), Pathway = c("A", "A", "B", "B", "C", 
"D")), row.names = c(1L, 2L, 3L, 4L, 5L, 6L), class = "data.frame")

【问题讨论】:

    标签: r


    【解决方案1】:

    转置df1,与df2合并,按路径分组,转回

    df1=data.frame(t(df1))
    df1$Gene=rownames(df1)
    
    df3=merge(df1,df2,by="Gene",how="all.x")
    df3=do.call(rbind,by(subset(df3,select=-c(Gene,Pathway)),list(df3$Pathway),colSums))
    df3=ifelse(df3>0,T,F)
    
    t(df3)
                 A     B     C     D
    X1800018 FALSE FALSE FALSE FALSE
    X1800021  TRUE  TRUE FALSE  TRUE
    X1800026 FALSE  TRUE FALSE FALSE
    X1800027  TRUE FALSE FALSE  TRUE
    X1800028 FALSE  TRUE FALSE FALSE
    X1800029 FALSE  TRUE FALSE  TRUE
    

    【讨论】:

      【解决方案2】:

      df1 转为data.frame 并将其转换为长格式。然后将其与df2 连接,并使用聚合函数any 将结果转换为更广泛的格式。

      library(tidyverse)
      
      df1 %>%
        as.data.frame() %>%
        rownames_to_column() %>%
        pivot_longer(cols = -rowname) %>%
        left_join(df2, by = c("name" = "Gene")) %>%
        pivot_wider(
          id_cols = rowname,
          names_from = Pathway,
          values_from = value,
          values_fn = any
        )
      

      如果要将列 rowname 转换为行名,请在管道末尾添加 column_to_rownames("rowname")

      【讨论】:

        猜你喜欢
        • 2020-01-08
        • 2019-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多