【问题标题】:rbind data based on matching values in a columnrbind 基于列中匹配值的数据
【发布时间】:2019-05-26 15:08:30
【问题描述】:

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

【问题讨论】:

    标签: r rbind


    【解决方案1】:

    我们基于“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')))
    

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

    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))
    

    【讨论】:

    • 谢谢!你能解释一下第二个选项是如何工作的吗?我不想单独列出所有数据框,因为它们很多。我的代码是out &lt;- Reduce(function(...) merge(..., by = 'word'), list(list_by_file[grepl("_1", names(list_by_file))])) data.frame(x = out$word, y = unlist(out[-1], use.name = FALSE)),但我收到错误Error in data.frame(x = out$word, y = unlist(out[-1], use.name = FALSE)) : arguments imply differing number of rows: 0, 12903
    • @Lisa 如果 data.frame 标识符与您显示的不同,您可能需要 mget(ls()) 假设您只有在全局环境中创建的那些 data.frames
    • @Lisa 关于错误,可能是长度不等的结果。您可以复制“our$x”列以匹配unlisted 输出的长度
    • out 对象似乎只是在复制我给它的列表。我的实际数据有两列以上。这可能是问题吗?我是 R 新手,不熟悉 ...,所以我不完全确定那里发生了什么。
    • @Lisa 我用更多信息更新了帖子。希望对你有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2022-11-13
    • 1970-01-01
    • 2021-10-08
    • 2021-05-01
    • 2019-02-17
    相关资源
    最近更新 更多