要根据列标题合并两个表:
所以我想用左连接合并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))
所以
最终
答案 0 :(得分:1)
我们可以基于intersect
和setdiff
创建两个索引
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