首页 > 解决方案 > 将两个数据框折叠成一个,其中条目被连接起来

问题描述

我有两个具有相同 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;')

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

非常感谢,克里斯。

标签: rdataframemerge

解决方案


这些仅使用基数 R。

1)我们首先使用Map两个paste数据框给出列表L,然后replacedf1条目转换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)另一种方法是将df1和都转换df2为矩阵,因为它们可以并行粘贴。我们将它们粘贴在一起给出字符向量p,然后使用replaceor out[]<-,如(1)。此替代方案不使用Map或类似。

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

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

out <- df1
out[] <- p

推荐阅读