合并和总结两个数据帧

时间:2016-04-22 10:20:24

标签: r dataframe merge

我有以下数据:

a <- data.frame(ID=c("A","B","Z","H"), a=c(0,1,2,45), b=c(3,4,5,22), c=c(6,7,8,3))
> a
  ID  a  b c
1  A  0  3 6
2  B  1  4 7
3  Z  2  5 8
4  H 45 22 3

b <- data.frame(ID=c("A","B","E","W","Z","H"), a=c(9,10,11,39,5,0), b=c(4,2,7,54,12,34), c=c(12,0,34,23,13,14))

> b
   ID  a  b  c
1:  A  9  4 12
2:  B 10  2  0
3:  E 11  7 34
4:  W 39 54 23
5:  Z  5 12 13
6:  H  0 34 14

我想合并两个数据帧,只保留data.frame a行并总结相同的列,所以最后得到:

> z
  ID  a   b   c
1  A  9   7  18
2  B 11   6   7
3  Z  7  17  21
4  H 45  56  17

到目前为止,我已尝试过以下内容:

merge(a,b,by="ID",all.x=T,all.y=F)
> merge(a,b,by="ID",all.x=T,all.y=F)
  ID a.x b.x c.x a.y b.y c.y
1  A   0   3   6   9   4  12
2  B   1   4   7  10   2   0
3  H  45  22   3   0  34  14
4  Z   2   5   8   5  12  13

> join(a,b,type="left",by="ID")
  ID  a  b c  a  b  c
1  A  0  3 6  9  4 12
2  B  1  4 7 10  2  0
3  Z  2  5 8  5 12 13
4  H 45 22 3  0 34 14

我无法总结这些专栏。

我的数据框非常大,所以如果解决方案可以加快甚至更好的事情。

3 个答案:

答案 0 :(得分:1)

这至少适用于您的示例:

a

首先,从b中的ID获取匹配的行,反之亦然,这样我们可以确定我们只有那些出现在两个数据帧中的行(我们现在知道它们的行索引在两个数据框中)。然后,只需对那些匹配的行使用向量化的加法,但省略factor,因为ID无法求和;手动添加my_return

答案 1 :(得分:1)

如果您的data.frame非常大,那么您可以考虑以下选项:

library(data.table)

## convert data.frame to data.table
setDT(a)

## convert data.frame to data.table
setDT(b)

## merge the two data.tables
c <- merge(a,b,by='ID')

## extract names of all columns except the first one i.e. ID
col_names <- colnames(a)[-1]

## query building
col_1 <- paste0(col_names,'.x')

col_2 <- paste0(col_names,'.y')

cols <- paste(col_1,col_2,sep=',')

cols_2 <- paste0(col_names," = sum(",cols,")")

cols_3 <- paste(cols_2,collapse=',')

query <- paste0("z <- c[,.(",cols_3,"),by=ID]")

## query execution
eval(parse(text = query))

答案 2 :(得分:0)

你不能直接添加两个数据帧是因为两个数据帧的大小都不相等。为了使它们具有相同的大小,您可以检查ID中存在于a的{​​{1}},然后按元素添加它们。

b