#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