我有一个数据帧,其中
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))
我只能想出一种带有循环和 if 函数的不优雅方法,并且不像我需要的那样通用(如上所述(。
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 中做到这一点。
这是
df
和key
的内部连接
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