如何在多行和多列的不同数据框中找到两个值之间的差异?

时间:2018-03-16 04:55:45

标签: r dataframe

我有两个数据帧:

DF1:

WAV    UV     VIOLET    BLUE
sD1    10.8   10.1      23.5
sA4    6.2    8.2       19.9
sA1    8.3    11.7      28.6
sC2    7.9    8.2       31.0
sC3    10.7   9.5       18.1

DF2:

ID    UV     VIOLET    BLUE
D1    7.9    10.1      19.3
D2    7.0    9.2       15.9
D3    21.4   20.7      27.4
D4    10.3   8.9       20.9
D5    21.7   16.5      21.3

我想找到df2中D1列的总和与df1中每行的列之间的差异,并在新的数据帧中生成此输出。然后,对于df2的D2,需要对每行df1重复这一过程,依此类推。每行的总和之间的每个新差异应该是新数据帧的单独条目,并且df2的差异行的每个列表应该是输出中的新行。所以输出应该如下所示:

D1    sum(D1)-sum(sD1)  sum(D1)-sum(sA4)  sum(D1)-sum(sA1)  sum(D1-sC2)  sum(D1)-sum(sC3)
D2    sum(D2)-sum(sD1)  sum(D2)-sum(sA4)  sum(D2)-sum(sA1)  sum(D2-sC2)  sum(D2)-sum(sC3)
D3    sum(D3)-sum(sD1)  sum(D3)-sum(sA4)  sum(D3)-sum(sA1)  sum(D3-sC2)  sum(D3)-sum(sC3)
D4    sum(D4)-sum(sD1)  sum(D4)-sum(sA4)  sum(D4)-sum(sA1)  sum(D4-sC2)  sum(D4)-sum(sC3)
D5    sum(D5)-sum(sD1)  sum(D5)-sum(sA4)  sum(D5)-sum(sA1)  sum(D5-sC2)  sum(D5)-sum(sC3)

我对任何建议持开放态度。

1 个答案:

答案 0 :(得分:0)

以下是三种方式,@ Onyambu在评论中已经提到过两种方式。其中,outer选项似乎是最快的。

outer(rowSums(df1[,-1]), rowSums(df2[,-1]), "-")

sapply(rowSums(df1[-1]),"-",rowSums(df2[-1]))

sapply(rowSums(df1[,-1]), function(x) x - rowSums(df2[,-1]))

例如,您可以这样做:

df <- data.frame(outer(rowSums(df1[,-1]), rowSums(df2[,-1]), "-"))
colnames(df) <- df1$WAV
rownames(df) <- df2$ID