如何添加列名相同的数据帧

时间:2016-03-27 08:33:02

标签: r dataframe

我有两个数据框df1df2。我想创建一个新的数据框df3,它只是df1df2的总和,其中列名相同。

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

4 个答案:

答案 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