我有以下数据:
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
我无法总结这些专栏。
我的数据框非常大,所以如果解决方案可以加快甚至更好的事情。
答案 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