【发布时间】:2021-06-01 14:29:03
【问题描述】:
我正在尝试使用 %in% 函数将我的一个数据集的观察结果与另一个数据集的观察结果相匹配。本质上,我想制作两个新数据集,一个包含第二个数据集的观察结果,另一个包含所有其他观察结果。这是一个示例数据集:
Df
Last.Name First.Name Group
Williams Bob A
Williams Dan C
Miller Bob A
Smith Dan C
Williams Rick A
Smart Jeff C
Miller Bob A
Smith Dan C
Jones Bob A
Williams Buddy C
Miller Bob A
Hends Dan C
Williams Rick A
Smart Jeff C
Millers Bob A
Smith Danny C
这是我试图匹配观察结果的数据集:
dfMatch
LastName FirstName
Williams Bob
Williams Buddy
Miller Bob
Smith Dan
Williams Rick
Smart Jeff
Miller Bob
Smith Dan
我尝试了以下代码的各种版本:
newdf<-Df[ Df$Last.Name %in% DfMatch$LastName & Df$First.Name %in% DfMatch$FirstName,]
和
newdf<-Df[ which(Df$Last.Name %in% DfMatch$LastName & Df$First.Name %in% DfMatch$FirstName),]
要获取这个新数据集:
newDF
Last.Name First.Name Group
Williams Bob A
Miller Bob A
Smith Dan C
Williams Rick A
Smart Jeff C
Miller Bob A
Smith Dan C
Williams Buddy C
但是,这不起作用。
我还想使用类似的代码来构建一个数据集,其中包含 dfMatch 集中未列出的所有观察结果,例如:
DfNoMatch
Last.Name First.Name Group
Williams Dan C
Jones Bob A
Miller Bob A
Hends Dan C
Williams Rick A
Smart Jeff C
Millers Bob A
Smith Danny C
通过使用类似的代码:
DfNoMatch<-Df[ !Df$Last.Name %in% DfMatch$LastName & Df$First.Name %in% DfMatch$FirstName,]
和
DfNoMatch<-Df[! which(Df$Last.Name %in% DfMatch$LastName & Df$First.Name %in% DfMatch$FirstName),]
提前感谢您,非常感谢您的帮助!
【问题讨论】:
-
你需要加入这个。与
dplyr:rows_in_both = inner_join(Df, dfMatch, by = c("Last.Name" = "LastName", "First.Name" = "FirstName"),DfNoMatch = anti_join(Df, dfMatch, by = c("Last.Name" = "LastName", "First.Name" = "FirstName") -
我想在我看完这个之后,如果我想过滤而不是匹配可能是最好的。有没有更有效的方法来做到这一点?
标签: r filter dplyr data-wrangling