如何使用来自另一个数据帧的多列对数据帧进行子集化

时间:2021-02-25 16:34:42

标签: r dplyr

我有两个数据框。一个是我的主数据库,另一个是数据库的一个子集

print(database)
col1 col2 x y
###  ###  1 1
###  ###  2 3
###  ###  4 5

print(selection)
x y
1 1
2 3

我需要从“数据库”中获取在选择中反映了 x 和 y 坐标的所有行。我知道我可以使用“subset()”运算符使用选择标准从数据库中提取行,例如

subset(database, database$x == 1 & database$y == 1)

将返回我的数据库中的第一行。但是如何应用此选择运算符来搜索多个选择条件?我可以尝试的一种方法是使用如上所述的嵌套 for 循环和子集运算符,但在我看来,在 R 中使用 for 循环显然是不受欢迎的,因此必须有更好的方法来做到这一点。

3 个答案:

答案 0 :(得分:0)

您可以在 dplyr 中运行连接:

matches <- database %>%
    inner_join(selection, by=c("x","y"))

答案 1 :(得分:0)

您在同一数据框中选择的示例应该是:

子集(数据库,x == 1 & y == 1)

但是要回答您的问题,您可以使用 merge:

merge(database, selection, by=c("x","y") )

当“选择”数据帧中的列的名称与目标数据帧的名称不同时,也可以这样做。有关更多示例,请参阅 ?merge

答案 2 :(得分:0)

使用 dplyr,这可以通过以下方式实现: res <- dplyr::inner_join(database, selection, by = c("x" = "x", "y" = "y"))

对于 R dplyr 函数中的大表,inner_join() 比 merge() 快得多。

其他优点是:

  • 行按现有顺序保存
  • 快得多
  • 告诉您要合并的密钥(如果您不提供)
  • 还可以处理数据库表。 (来自 dplyr 的创建者 Hadley Wickham)