根据列中的匹配值来查找数据

时间:2019-05-26 15:08:31

标签: r rbind

我有几个要合并的数据框,但是我需要摆脱其他数据框中的列中没有匹配值的行。例如,我想根据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列中没有匹配值的行则不包括在内。

1 个答案:

答案 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