如何针对这种特定情况在 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
其他选项,在base
R:
你可以粘贴你的 a
和 b
变量来子集你的 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
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
其他选项,在base
R:
你可以粘贴你的 a
和 b
变量来子集你的 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