基于R

时间:2018-11-28 09:11:35

标签: r

要根据列标题合并两个表:

所以我想用左连接合并TableA和TableB,并希望得到OutputTable中提到的输出。

要进一步解释,OutputTable应该像:

1)包含TableA中的所有列标题

2)将表B中存在的数据粘贴到类似的列中。

3)TableA中不存在的TableA列的数据为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 :(得分:1)

我们可以基于intersectsetdiff创建两个索引

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

通过子集“ TableA”共有的“ TableB”列来创建新数据集,将“ TableA”中不同的列设置为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

答案 1 :(得分:1)

您可以使用库gtools

library(gtools)

output <- smartbind(TableA,TableB)
str(output)
output[is.na(output)] <- 0

答案 2 :(得分:0)

通常,您可以使用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