我有这样的DF1:
ID Name Team
222717 Bob Badgers
321817 James Tigers
521917 Eric Possums
而DF2是这样的:
Badgers Tigers Possums
222717 438283 521917
789423 978748 251233
我想检查DF1中的ID是否出现在DF2中相应的团队名称中。例如,在第一行中,Bob的ID确实出现在DF2中他的团队名称“Badgers”下。在DF2中,詹姆斯的身份证不会出现在他的球队名下,“老虎队”。我正在考虑添加一个标记是否出现的列,但无法弄清楚如何在DF2中引用该列。这是我尝试过的。
test <- mutate(DF1,validID=ifelse(ID%in%DF2$DF1$Team,"Yes",NA))
DF2$DF1$Team
部分是我被卡住的地方。如何引用DF2中与DF1中列出的团队相对应的列?同时开放有关如何操作数据以实现此任务的替代建议。
%in%
函数是访问match
函数的紧凑方式。 mapply
是提供多个列以按顺序评估其相应值的规范方法。
DF1$right2 <- mapply( function(a,b) {a %in% DF2[[b]]}, a=DF1$ID, b=as.character(DF1$Team) )
#============
> DF1
ID Name Team right2
1 222717 Bob Badgers TRUE
2 321817 James Tigers FALSE
3 521917 Eric Possums TRUE
老实说,我发现mapply
难以概念化,无论如何42的answer似乎为Eric返回FALSE,当它应该返回true时。最有可能是拼写错误,但为了将来参考,以一种允许您复制代码并创建正确对象的格式提供样本数据会很有帮助!
这是一个快速的方法来避免map
或apply
函数,只使用tidyverse
工具(和一个magrittr
别名,但你可以分出来)。在这里,我将“找到正确的列”和“检查ID是否存在”分为两个步骤,但如果您愿意,可以合并。
library(tidyverse)
library(magrittr)
df1 <- tibble(ID = c(222717, 321817, 521917),
Name = c("Bob", "James", "Eric"),
Team = c("Badgers", "Tigers", "Possums")
)
df2 <- tibble(Badgers = c(222717, 789423),
Tigers = c(438283, 978748),
Possums = c(521917, 251233)
)
df1 %>%
mutate(team_col = colnames(df2) %>% equals(Team) %>% which()) %>%
mutate(id_exists_for_team = ID %in% as_vector(df2[team_col]))
#> # A tibble: 3 x 5
#> ID Name Team team_col id_exists_for_team
#> <dbl> <chr> <chr> <int> <lgl>
#> 1 222717 Bob Badgers 1 TRUE
#> 2 321817 James Tigers 2 FALSE
#> 3 521917 Eric Possums 3 TRUE