我有几个要合并的数据框,但是我需要摆脱其他数据框中的列中没有匹配值的行。例如,我想根据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列中没有匹配值的行则不包括在内。
答案 0 :(得分:2)
我们基于{x1}个元素“ x”创建索引
intersect
如果数据集对象很多,最好将其保留在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+$"))
等,但这是在全局环境中加载的唯一data.frame对象
xyz, abc, fq12
然后,获取列'x'的interesecitng元素
lst1 <- mget(names(eapply(.GlobalEnv, 'is.data.frame')))
使用相交矢量将v1 <- Reduce(intersect, lapply(lst1, `[[`, "x"))
元素的行作为子集
list
在这里,我们假设所有数据集的列名都相同
另一种选择是先进行do.call(rbind, lapply(lst1, function(x) dat[dat$x %in% v1,]))
,然后进行merge
unlist