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'
的 intersect
ing 元素创建索引
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))
我有几个要合并的数据框,但我需要删除其他数据框中列中没有匹配值的行。例如,我想根据 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'
的intersect
ing 元素创建索引
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))