我有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")))
答案 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
....