rbind 数据基于列中的匹配值

rbind data based on matching values in a column

我有几个要合并的数据框,但我需要删除其他数据框中列中没有匹配值的行。例如,我想根据 x 列中的值合并 a、b 和 c 数据框。

a <- data.frame(1:5, 5:9)
colnames(a) <- c("x", "y")
b <- data.frame(1:4, 7:10)
colnames(b) <- c("x", "y")
c <- data.frame(1:3, 6:8)
colnames(c) <- c("x", "y")

结果为

1   5
2   6
3   7
1   7
2   8
3   9
1   6
2   7
3   8

其中前三行来自数据框 a,后三行来自数据框 b,第三三行来自数据框 c,以及 x 列中没有匹配值的行不包括在内。

我们根据 'x'

intersecting 元素创建索引
v1 <- Reduce(intersect, list(a$x, b$x, c$x))
rbind(a[a$x %in% v1,], b[b$x %in% v1,], c[c$x %in% v1, ])
#  x y
#1 1 5
#2 2 6
#3 3 7
#4 1 7
#5 2 8
#6 3 9
#7 1 6
#8 2 7
#9 3 8

如果有很多数据集对象,最好将其保存在一个list中。在这里,示例显示对象标识符完全不同,但是如果标识符具有模式,例如df1, df2, ..df100 等等,变得更容易达到 list

lst1 <- mget(ls(pattern = "^df\d+$"))

如果对象标识符完全不同 xyz, abc, fq12 等,但这些是全局环境中加载的唯一 data.frame 个对象

lst1 <-  mget(names(eapply(.GlobalEnv, 'is.data.frame')))

然后,获取列的interesecitng元素'x'

v1 <- Reduce(intersect, lapply(lst1, `[[`, "x"))

使用相交向量对 list 个元素的行进行子集化

do.call(rbind, lapply(lst1, function(x) dat[dat$x %in% v1,]))

在这里,我们假设列名在所有数据集中都是相同的


另一种选择是 merge 然后 unlist

out <- Reduce(function(...) merge(..., by = 'x'), list(a, b, c))
data.frame(x = out$x, y = unlist(out[-1], use.name = FALSE))