Объединение двух таблиц на основе заголовков столбцов в R - PullRequest
0 голосов
/ 28 ноября 2018

Хотел бы объединить две таблицы на основе заголовка столбца:

Поэтому я хотел бы объединить TableA и TableB с видом левого соединения и получить вывод, как указано в OutputTable.

Чтобы объяснить это далее, OutputTable должен выглядеть следующим образом:

1) Содержит заголовок всех столбцов из TableA

2) Вставляет данные, которые присутствовали в TableB, в аналогичные столбцы.

3) Столбец таблицы А, который не представлен в таблице В, будет иметь данные в виде 0

TableA <- data.frame(
  action =  c(0, 1, 1, 0, 0),
  actor  =  c(1, 1, 1, 1, 0),
  also   =  c(1, 0, 1, 1, 1),
  anim   =  c(1, 1, 0, 1, 1),
  appear =  c(0, 0, 1, 0, 1))

TableB <- data.frame(
  action = c(1, 0, 0, 0, 0),
  actor  = c(0, 1, 0, 1, 0),
  also   = c(1, 0, 0, 1, 1),
  bear   = c(0, 1, 1, 0, 1),
  book   = c(1, 0, 0, 0, 1),
  appear = c(0, 0, 1, 0, 1))

OutputTable <- data.frame(
  action = c(1, 0, 0, 0, 0),
  actor  = c(0, 1, 0, 1, 0),
  also   = c(1, 0, 0, 1, 1),
  anim   = c(0, 0, 0, 0, 0),
  appear = c(0, 0, 1, 0, 1))

enter image description here

То есть

enter image description here

Финал

enter image description here

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

В общем, вы можете использовать merge.Сначала вам нужно создать ключ, чтобы объединить данные (как в SQL).Например, если первые два столбца интересуют вас, вы можете сделать следующее:

colsofinterest <- 1:2
TableA$id <- apply(TableA[,colsofinterest], 1, function(x) paste0(x, collapse=""))
TableB$id <- apply(TableB[,colsofinterest], 1, function(x) paste0(x, collapse=""))
res3 <- merge(TableA, TableB, by="id", all.x=TRUE, all.y=FALSE)

Однако, чтобы получить желаемый результат, я бы не использовал объединение, а просто добавил столбец.

res2 <- TableB[,c(1:3,4)]
res2$anim <- 0
res2
  action actor also bear anim
1      1     0    1    0    0
2      0     1    0    1    0
3      0     0    0    1    0
4      0     1    1    0    0
5      0     0    1    1    0
0 голосов
/ 28 ноября 2018

Вы можете сделать это, используя библиотеку gtools

library(gtools)

output <- smartbind(TableA,TableB)
str(output)
output[is.na(output)] <- 0
0 голосов
/ 28 ноября 2018

Мы можем создать два индекса на основе intersect и setdiff

nm1 <- intersect(names(TableA), names(TableB))
nm2 <- setdiff(names(TableA), names(TableB))

Создать новый набор данных путем подстановки столбцов «TableB», общих для «TableA», Установить столбцы, которыеотличается в «Таблице A» с 0

df3 <- TableB[nm1]
df3[nm2] <- 0
df3
#   action actor also appear anim
#1      1     0    1      0    0
#2      0     1    0      0    0
#3      0     0    0      1    0
#4      0     1    1      0    0
#5      0     0    1      1    0

Если столбцы order важны,

library(tidyverse)
bind_rows(TableA, TableB, .id = 'grp') %>% 
      select_if(~ !is.na(.[1])) %>%
      filter(grp == 2) %>%
      select(-grp) %>%
      mutate_all(replace_na, 0)
#    action actor also anim appear
#1      1     0    1    0      0
#2      0     1    0    0      0
#3      0     0    0    0      1
#4      0     1    1    0      0
#5      0     0    1    0      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...