Как суммировать один и тот же столбец разных фреймов данных в R - PullRequest
0 голосов
/ 07 января 2019

У меня есть 4 кадра данных, и каждый из них имеет одинаковое количество строк и столбцов. Значения в столбце 1,2,5 одинаковы в каждом фрейме данных. Из этих 4 фреймов данных я хочу получить один фрейм данных, в котором третий и четвертый столбцы ('pred1' и 'pred2') создаются путем суммирования значений в 4 фреймах данных. Возможно ли это сделать? вот мои данные:

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 голосов
/ 07 января 2019

Если 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
        ....
0 голосов
/ 07 января 2019

Как насчет

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

Основываясь на предложениях Грегора, вы также можете создать вектор для хранения столбцов, которые будут добавлены (если их много), а затем добавить их вместе как

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")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...