我有两个数据框df1
和df2
。我想创建一个新的数据框df3
,它只是df1
和df2
的总和,其中列名相同。
df1 <- data.frame(x1=c(1,4,5),x2=c(5,6,7),x3=c(9,9,10))
df2 <- data.frame(x1=c(1,6,3),x2=c(4,3,1),x3=c(5,4,6),x4=c(7,6,7))
df1
x1 x2 x3
1 1 5 9
2 4 6 9
3 5 7 10
df2
x1 x2 x3 x4
1 1 4 5 7
2 6 3 4 6
3 3 1 6 7
df3
x1 x2 x3 x4
1 2 9 14 7
2 10 9 13 6
3 8 8 16 7
答案 0 :(得分:5)
我们在&#39; df1&#39;中找到了常见的列名称。和&#39; df2&#39; (&#39; NM1&#39)。创建&#39; df2&#39;的副本(&#39; DF3&#39)。添加数据集子集(df1[nm1]
,df2[nm1]
)并将其分配给&#39; df3&#39;的相应子集。
nm1 <- intersect(names(df1), names(df2))
df3 <- df2
df3[nm1] <- df1[nm1]+df2[nm1]
df3
# x1 x2 x3 x4
#1 2 9 14 7
#2 10 9 13 6
#3 8 8 16 7
如果&#39; df1&#39;中有其他唯一列?那些不在&#39; df2&#39;反之,一种选择是将数据集放在list
中,然后将rbind
放在rbindlist
(来自data.table
),创建一个序列列(&#39; N&#39;)并使用lapply
获取每列的sum
。
library(data.table)
rbindlist(list(df1, df2), fill=TRUE, idcol=TRUE)[,
N:= 1:.N, .id][,lapply(.SD, sum, na.rm=TRUE) ,
by = N , .SDcols=x1:x4][, N:= NULL][]
# x1 x2 x3 x4
#1: 2 9 14 7
#2: 10 9 13 6
#3: 8 8 16 7
答案 1 :(得分:1)
以下是一个想法:
node-sass
答案 2 :(得分:0)
尝试
i <- which((!names(df2) %in% names(df1)))
a <- df2[-i]+df1
df3 <- cbind(a, df2[i])
答案 3 :(得分:0)
这是另一种方法。
df1 <- data.frame(x1=c(1,4,5),x2=c(5,6,7),x3=c(9,9,10))
df2 <- data.frame(x1=c(1,6,3),x2=c(4,3,1),x3=c(5,4,6),x4=c(7,6,7))
df3 <- merge(df1, df2, all=T, sort=F)
df3[is.na(df3)] <- 0
df4 <- df3[1:(nrow(df3)/2), ] + df3[(nrow(df3)/2+1):nrow(df3), ]
df4
# x1 x2 x3 x4
# 1 2 9 14 7
# 2 10 9 13 6
# 3 8 8 16 7