dplyr如何在R中按列的笛卡尔积的元素进行过滤?

时间:2019-04-24 20:52:50

标签: r filter dplyr

我有一个data.frame,其中

df = data.frame(a = c(1,1,1,2,2,2),b = c(1,2,1,2,1,2), c = c(1,2,3,4,5,6))

我想保留与键匹配的行。例如,

key = data.frame(a = c(1,2), b = c(1,2))

在这种情况下,我要删除不包含(a = 1和b = 1)或(a = 2和b = 2)的行。通常,a和b对的值不是相同的值,并且匹配的列可能会多于两个。重要的部分是仅保留键中的行。产生的data.frame应该看起来像

df_result = data.frame(a = c(1,1,2,2), b = c(1,1,2,2), c = c(1,3,4,6))

我只能想出一种带有循环的优雅方法,如果函数又没有像我所需要的那样概括(如上所述)。

nomatch = numeric(0)
for(i in 1:nrow(df)){
   if((df$a[i] != key$a[1] | df$b[i] != key$b[1]) & (df$a[i] != key$a[2] | df$b[i] != key$b[2]))
       nomatch = c(nomatch,i)
}

df_result2 = df[-nomatch,]

我希望能够在dplyr中做到这一点。

1 个答案:

答案 0 :(得分:1)

这是dfkey的内部联接

library(dplyr)

df %>% 
  inner_join(key)

#   a b c
# 1 1 1 1
# 2 1 1 3
# 3 2 2 4
# 4 2 2 6