如何针对这种特定情况在 r 中进行子集化?

how to subset in r for this particular condition?

df1 和 df2 有 a,b 列。我想对 df1 中的数据进行子集化,以便 df1$a 和 df1$b 中的每个条目都在 df2$a 和 df2$b 中。

df1
a   b  c
1   m  df1
2   f  df1
3   f  df1
4   m  df1
5   f  df1
6   m  df1

df2
a   b  c
1   m  df2
3   f  df2
4   f  df2
5   m  df2
6   f  df2
7   m  df2

期望的输出

df
a   b  c
1   m  df1
3   f  df1

我正在使用:

df <- subset(df1,(df1$a%in%df2$a & df1$b%in%df2$b))

但这给出的结果类似于

df <-subset(df1,df1$a%in%df2$a)

您可以使用包 dplyr:

library(dplyr)
intersect(df1,df2)
#  a b
#1 1 m
#2 3 f

编辑 为新的 data.frames 和 c 列: 您可以使用函数 semi_join(也来自 dplyr):

semi_join(df1,df2,by=c("a","b"))
#  a b   c
#1 1 m df1
#2 3 f df1

其他选项,在baseR:
你可以粘贴你的 ab 变量来子集你的 data.frame:

df1[paste(df1$a,df1$b) %in% paste(df2$a,df2$b), ]
#  a b
#1 1 m
#3 3 f

以及新的 data.frames:

   #   a b   c
   # 1 1 m df1
   # 3 3 f df1

或者你可以

Res <- rbind(df1, df2) 
Res[duplicated(Res), ]
#   a b
# 7 1 m
# 8 3 f

编辑 1:根据编辑,这里有一个类似的 data.table 解决方案

library(data.table)
Res <- rbind(df1, df2)
setDT(Res)[duplicated(Res, by = c("a", "b"), fromLast = TRUE)]
#    a b   c
# 1: 1 m df1
# 2: 3 f df1

Edit2:我看到@CathG 打开了一个加入前线,所以这是我们如何使用 data.table

setkey(setDT(df1), a, b) ; setkey(setDT(df2), a, b)
df1[df2, nomatch = 0]
#    a b   c i.c
# 1: 1 m df1 df2
# 2: 3 f df1 df2