#r #dataframe
#r #фрейм данных
Вопрос:
Я генерирую две таблицы, используя table
команду в R
. Я хочу создать таблицу / фрейм данных / матрицу таким образом, чтобы были представлены все имена из обеих таблиц и в выходные данные были включены правильные значения «ноль». например
Имеющиеся у меня в настоящее время данные выглядят примерно следующим образом
Таблица 1
A B C
1 2 4
Таблица 2
C D E
3 4 4
Я хотел бы получить следующий вывод:
Table1 Table2
A 1 0
B 2 0
C 4 3
D 0 4
E 0 4
Как я могу это сделать в R?
Ответ №1:
без изменения формы:
t1 <- table(c("A", rep("B", 2), rep("C", 4)))
t2 <- table(c(rep("C", 3), rep("D", 4), rep("E", 4)))
ndf <- merge(t1, t2, by = "Var1", all = TRUE)
ndf[is.na(ndf)] <- 0
ndf
Var1 Freq.x Freq.y
1 A 1 0
2 B 2 0
3 C 4 3
4 D 0 4
5 E 0 4
Ответ №2:
Игнорируя то, что я считаю опечаткой в вашем вопросе (частоты C должны быть 4 и 3, верно, а не 2 и 3?), вы можете сделать это, принудительно используя фреймы данных и затем объединяя:
t1 <- table(rep(LETTERS[1:3],times=c(1,2,4)))
t2 <- table(rep(c("C","D",'E'),times=c(3,4,4)))
merge(as.data.frame(t1),as.data.frame(t2),by="Var1",all=T)
а затем преобразовать NAs в нули.
Ответ №3:
ДАННЫЕ
dat <- list(rep(LETTERS[1:3],times=c(1,2,4)),rep(LETTERS[3:5],times=c(3,2,2)))
код
f <- function(d){
lev <- unique(unlist(d, use.names=FALSE))
d <- lapply(d, factor, levels=lev)
r <- do.call(cbind, lapply(d, table))
colnames(r) <- paste("Table", seq(NCOL(r)), sep="")
return(r)
}
ВЫВОД
f(dat)
Table1 Table2
A 1 0
B 2 0
C 4 3
D 0 2
E 0 2
Комментарии:
1. Хороший способ продемонстрировать, как написать (и использовать) функцию в R.
2. Привет! Это отличное решение и хорошая демонстрация. Спасибо.