Как мне суммировать два фрейма данных, которые имеют разные размеры в R

#r

#r

Вопрос:

Я хочу суммировать два фрейма данных, например,

 > ab
  1 2 3 4 5
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
4 0 0 0 0 0

> cd
  2 3 4 5
1 1 1 1 1
2 1 1 1 1
4 1 1 1 1
  

Чтобы элементы суммировались по соответствующим именам строк и столбцов в большем фрейме данных, так что,

 > ab
  1 2 3 4 5
1 0 1 1 1 1
2 0 1 1 1 1
3 0 0 0 0 0
4 0 1 1 1 1 
  

Код для фреймов данных

 a <- array(0, c(4,5))
ab <- data.frame(a, row.names = c(1,2,3,4))
ab <- rename(ab, c("X1" = "1", "X2" = "2", "X3" = "3", "X4" = "4", "X5"= "5"))           

c <- array(1, c(3,4))
cd <- data.frame(c, row.names= c(1,2,4))
cd <- rename(cd, c("X1"="2", "X2"="3", "X3"="4", "X4"= "5")) 
  

Любая помощь будет очень признательна, спасибо.

Ответ №1:

Если порядок имен измерений идентичен:

 ab <- as.matrix(ab)
cd <- as.matrix(cd)

ab[rownames(ab) %in% rownames(cd), colnames(ab) %in% colnames(cd)] <- 
  ab[rownames(ab) %in% rownames(cd), colnames(ab) %in% colnames(cd)]  
  cd

ab
#  1 2 3 4 5
#1 0 1 1 1 1
#2 0 1 1 1 1
#3 0 0 0 0 0
#4 0 1 1 1 1
  

Ответ №2:

Вы могли бы использовать объединение data.table:

 ab$rn <- rownames(ab)
cd$rn <- rownames(cd)

library(data.table)
setDT(ab)
setDT(cd)


abm <- melt(ab, id = "rn")
cdm <- melt(cd, id = "rn")

abm[cdm, value := i.value   value, on = .(rn, variable)]
res <- dcast(abm, rn ~ variable)
res[, rn := NULL]
res
#   1 2 3 4 5
#1: 0 1 1 1 1
#2: 0 1 1 1 1
#3: 0 0 0 0 0
#4: 0 1 1 1 1