Как мне объединить два списка в R?

#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. Привет! Это отличное решение и хорошая демонстрация. Спасибо.