我有这样的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确实出现在他的团队名称下," Badgers,"在DF2。詹姆斯' ID不会出现在他的团队名下," Tigers,"在DF2。我想添加一个标记是否出现的列,但无法弄清楚如何在DF2中引用该列。这是我尝试过的。
test <- mutate(DF1,validID=ifelse(ID%in%DF2$DF1$Team,"Yes",NA))
DF2$DF1$Team
部分是我被困的地方。如何引用DF2中与DF1中列出的团队相对应的列?还可以参考有关如何操作数据来完成此任务的其他建议。
答案 0 :(得分:3)
%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
答案 1 :(得分:0)
老实说,我发现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