按行输入的另一个数据框中的引用列

时间:2017-12-18 23:21:20

标签: r

我有这样的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中列出的团队相对应的列?还可以参考有关如何操作数据来完成此任务的其他建议。

2 个答案:

答案 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时。很可能是拼写错误,但为了将来参考,以一种允许您复制代码并创建正确对象的格式提供样本数据会很有帮助!

这是一种避免mapapply功能的快速方法,仅使用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