如何对R中不同数据帧的同一列求和

时间:2019-01-07 16:49:26

标签: r dataframe

我有4个数据框,每个数据框具有完全相同的行数和列数。每个数据帧中的1,2,5列中的值相同。从这4个数据帧中,我想获得一个数据帧,在其中通过对4个数据帧中的值求和来创建第三列和第四列(“ pred1”和“ pred2”)。有可能这样做吗?这是我的数据框:

df1  = read.csv(fname1,header=FALSE,col.names=c("c1", "c2", "pred1", "pred2","c5")))
df2  = read.csv(fname2,header=FALSE,col.names=c("c1", "c2", "pred1", "pred2","c5")))
df3  = read.csv(fname3,header=FALSE,col.names=c("c1", "c2", "pred1", "pred2","c5")))
df4  = read.csv(fname4,header=FALSE,col.names=c("c1", "c2", "pred1", "pred2","c5")))

2 个答案:

答案 0 :(得分:2)

怎么样

df5 <- df1
df5$pred1 <- df1$pred1 + df2$pred1 + df3$pred1 + df4$pred1
df5$pred2 <- df1$pred2 + df2$pred2 + df3$pred2 + df4$pred2

根据Gregor的建议,您还可以创建一个向量来存储要添加的列(以防万一),然后将它们与一起添加

cols = c("pred1", "pred2")
df5[, cols] = df1[, cols] + df2[, cols] + df3[, cols] + df4[, cols]

akrun还提供了一个我不遵循的建议,但似乎也可以与任意多个数据帧一起很好地工作(只需将1:4扩展为1:n,其中n是最后一个df的数量)。

Reduce("+", lapply(mget(paste0('df', 1:4)), "[[", c("pred1", "pred2")))

答案 1 :(得分:-1)

如果合并时df1,d2,df3和df 4具有相同的值 您将获得df5,它将具有df1值和df1的大小 比为什么你不只是

          df5 <- df1
          df5$Pred1 <- rowSums(df1)
          df5$pred2 <- rowSums(df5[,1:4])

首先,您应该合并所有df,然后仅创建一个新的列pred1和pred2

     df1 <- data.frame(c1= c(1,1,2,2,4),c2 = c(2,2,3,3,5),c5 = c(3,4,4,5,6))
     df2 <- data.frame(c1= c(10,1,2,2,4),c2 = c(2,2,30,3,5),c5 = c(3,4,40,5,6))
     df3 <- data.frame(c1= c(15,1,2,2,4),c2 = c(22,2,3,3,5),c5 = c(3,44,4,5,6))
     df4 <- data.frame(c1= c(12,1,2,2,4),c2 = c(2,23,3,3,5),c5 = c(3,4,45,5,6))
     tmp <- merge(df1,df2,by= c("c1","c2","c5"),all.x = TRUE,all.y=TRUE)
     tmp <- merge(tmp,df3,by= c("c1","c2","c5"),all.x = TRUE,all.y=TRUE)
     tmp <- merge(tmp,df4,by= c("c1","c2","c5"),all.x = TRUE,all.y=TRUE)
     tmp$pred1 = rowSums(tmp[,1:3])
     tmp:

     tmp
        c1 c2 c5 pred1
        1   1  2  3     6
        2   1  2  4     7
        3   1  2 44    47
        4   1 23  4    28
        5   2  3  4     9
        ....