【问题标题】:Collapse two data frames into one where entries get concatenated将两个数据框折叠成一个,其中条目被连接起来
【发布时间】:2020-09-08 13:58:46
【问题描述】:

我有两个具有相同 row.names 和 colnames 的数据框。但是,每个字段中的条目在两个 data.frame 之间有所不同。

像下面这样的结构:

df1 = data.frame(SETD2 = c('AMP', NA, ''), PIK3CA = c('', 'AMP', 'AMP'))

row.names(df1) = c('Sample1', 'Sample2', 'Sample3')

df2 = data.frame(SETD2 = c('', 'Nonstop', 'truncating'), PIK3CA = c('nonsense', 'InFrame', ''))

row.names(df2) = c('Sample1', 'Sample2', 'Sample3')

我只是在寻找一种简单的解决方案,将这两个数据帧合并为一个数据帧,其中所需的输出看起来就像

df3 = data.frame(SETD2 = c('AMP;', 'NA;NonStop', 'truncating'), PIK3CA = c('nonsense', 'AMP;InFrame', 'AMP;')

如您所见,只是各个条目被合并并由 ';'

非常感谢, 克里斯。

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    这些仅使用基本 R。

    1) 我们首先在两个数据帧上使用Mappaste 给出列表L 然后replace df1 条目将L 转换为数据框架。

    L <- Map(function(...) paste(..., sep = ";"), df1, df2)
    replace(df1, TRUE, L)
    

    将最后一行替换为:

    out <- df1
    out[] <- L
    

    或者用这个:

    as.data.frame(L, row.names = rownames(df1))
    

    在每种情况下,我们得到:

                  SETD2      PIK3CA
    Sample1        AMP;   ;nonsense
    Sample2  NA;Nonstop AMP;InFrame
    Sample3 ;truncating        AMP;
    

    2) 另一种方法是将df1df2 都转换为矩阵,因为它们可以并行粘贴。我们将它们粘贴在一起给出字符向量p,然后使用replaceout[]&lt;-,如(1)所示。此替代方法不使用 Map 或类似名称。

    p <- paste(as.matrix(df1), as.matrix(df2), sep = ";")
    replace(df1, TRUE, p)
    

    或将上面的最后一行替换为:

    out <- df1
    out[] <- p
    

    【讨论】:

    • 非常感谢 :) 我能想到的最有效的方法 ~ 效果很好,但是 row.names() 没有被保留......但是,可以这样生活:) 谢谢,chir。
    • 添加了变体。现在全部设置行名。
    【解决方案2】:

    我会建议使用paste0()bind_rows() 接近您想要的tidyverse 方法。代码如下:

    library(tidyverse)
    #Code
    bind_rows(df1 %>% mutate(id=row_number()),df2 %>% mutate(id=row_number())) %>%
      group_by(id) %>%
      summarise(SETD2=paste0(SETD2,collapse = ';'),
                PIK3CA=paste0(PIK3CA,collapse = ';')) %>% select(-id)
    

    输出:

    # A tibble: 3 x 2
      SETD2       PIK3CA     
      <chr>       <chr>      
    1 AMP;        ;nonsense  
    2 NA;Nonstop  AMP;InFrame
    3 ;truncating AMP;    
    

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多