【问题标题】:Match columns from two dataframes and filter on the value of another columns匹配来自两个数据框的列并过滤另一列的值
【发布时间】:2016-08-04 20:13:45
【问题描述】:

我有两个列数相同但行数不同的数据框:

colA colB colC colD
xxx  303  200  A
yyy  111  20   B
zzz  24  188   C

我需要将colAdf1 匹配到colAdf2 并只选择df1$colB - df2$colC <= 2000 所在的行

我尝试执行 for 循环,但没有成功:

for (i in nrow(df1)) {
    for (j in nrow(df2)) {
        df3 <- subset(merge(df2[j,], df1[i,], by="row.names", all=T), df2$colA[j] == df1$colA[i] && (df1$colB[i] - df2$colC[j]) <= abs(2000))
    }
}

我做错了什么?它没有给我任何错误,但新的数据框是空的。

【问题讨论】:

  • 描述中可能类似于dfNew &lt;- merge(df1, df2[c("colA", "colC"), by="colA"]); dfNew &lt;- dfNew[(dfNew$colB - dfNew$colC) &lt;= 2000, ]
  • 那行得通。谢谢!

标签: r for-loop apply


【解决方案1】:

如果dplyr 是一个选项,试试这个:

df1 %>%
    inner_join(df2, by = "colA") %>%
    filter(abs(colB.x - colC.y) <= 2000)

这将为您提供一个带有列的框架 colA, colB.x, colC.x, colD.x, colB.y, colC.y, colD.y 其中 .x 来自 df1,.y 来自 df2。 另请注意,b - a &lt;= abs(2000) 可能意味着abs(b - a) &lt;= 2000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多