Как объединить два входных значения матрицы непредвиденных обстоятельств?
У меня есть такой xtabs
объект:
structure(c(1, 4, 7, 2, 5, 8, 3, 6, 9), .Dim = c(3L, 3L),
.Dimnames = structure(list(Var1 = c("A", "B", "C"), Var2 = c("A", "B", "C")),
.Names = c("Var1", "Var2")), class = c("xtabs", "table"))
который дает:
Var2
Var1 A B C
A 1 2 3
B 4 5 6
C 7 8 9
Я хотел бы объединить два значения Var1
а также Var2
например, "A" и "B", в новом значении "D", сохраняющем свойства матрицы непредвиденных обстоятельств.
Таким образом, результат будет для примера:
Var2
Var1 D C
D 12 9
C 15 9
2 ответа
Чтение объекта xtabs в a
Вы можете тогда:
b<-as.data.frame.table(a)
levels(b$Var1) <- list(D=c("A","B"),C="C")
levels(b$Var2) <- list(D=c("A","B"),C="C") #Thanks @Henrik!
xtabs(Freq ~ Var1 + Var2, b)
Альтернативный подход, который можно адаптировать для более крупных факторов, используя пару слияний b$Var1.merge <-b $ Var1 b $ Var2.merge <-b $ Var2
# Add the new level for the factors
levels(b$Var1.merge) <- c(levels(b$Var1.merge), "D")
levels(b$Var2.merge) <- c(levels(b$Var2.merge), "D")
#Collapse the factors
b$Var1.merge[b$Var1%in%c("A","B")] <- "D"
b$Var2.merge[b$Var2%in%c("A","B")] <- "D"
xtabs(Freq ~ Var1.merge + Var2.merge, b, drop.unused.levels=T)
Конечно, в зависимости от того, откуда появился ваш исходный объект xtabs, вы можете легко это сделать на исходных данных.
Это позволяет обойти проблемы, которые могут возникнуть при работе с факторами, если выбрать маршрут data.frame:
> tbl2 <- rbind(colSums(tbl[1:2, ]), tbl[3, ])
> tbl2
A B C
[1,] 5 7 9
[2,] 7 8 9
> tbl3 <- cbind(rowSums(tbl2[, 1:2]), tbl2[ ,2] )
> tbl3
[,1] [,2]
[1,] 12 7
[2,] 15 8
И это показывает, как сделать это с указанным набором буквенных значений для свертывания:
> tbl2 <- rbind(colSums(tbl[row.names(tbl) %in% c("A","B"), ]),
tbl[!row.names(tbl) %in% c("A","B"), ])
> tbl2
A B C
[1,] 5 7 9
[2,] 7 8 9
> tbl3 <- cbind(rowSums(tbl2[, colnames(tbl) %in% c("A","B")]),
tbl2[,!colnames(tbl) %in% c("A","B")] )
> tbl3
[,1] [,2]
[1,] 12 9
[2,] 15 9