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

问题描述 投票:0回答:2

我有这样的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中列出的团队相对应的列?同时开放有关如何操作数据以实现此任务的替代建议。

r
2个回答
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

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
© www.soinside.com 2019 - 2024. All rights reserved.