基于两个变量的条件匹配

时间:2019-12-30 17:03:47

标签: r

我有一个具有类似的多行和多列的DF。我想将viewModel = ViewModelProvider(this ).get(CommentsViewModel::class.java) Name匹配。如果Name1Name不匹配,我还要尝试将Name1Name匹配。然后,如果匹配,我希望将Name3的值作为新变量Name2返回。

Namevalue

所需的输出

df
Name      Name1    Name2   Name3
Natalie   Shawn    Edmund  Natalie
Desmond   Desmond  James   Sue
Kylie     Kylie    Brent   Manny

我已经尝试过了:

df
Name      Name1    Name2   Name3     Namevalue
Natalie   Shawn    Edmund  Natalie   Edmund
Desmond   Desmond  Tyler   Sue       Tyler
Kylie     Chris    Tam     Kylie     Tam
Leah      Chewie   Luke    Solo      Unknown

不幸的是,如果匹配不正确,它将无法正常工作。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的ifelse()想法是一个好的开始,但是,您的情况略有错误,希望对您有所帮助:

代码

测试:如果name1中的匹配项name3中的(|)匹配项,则分配name2

df$Namevalue <- ifelse(df$Name %in% df$Name1 | df$Name %in% df$Name3,
                       df$Name2,
                       NA)
#
     Name   Name1  Name2   Name3 Namevalue
1 Natalie   Shawn Edmund Natalie    Edmund
2 Desmond Desmond  Tyler     Sue     Tyler
3   Kylie   Chris    Tam   Kylie       Tam
4    Leah  Chewie   Luke    Solo      <NA>

更新后的答案

如果想知道name1name3是否匹配。

您只能首先与name1进行匹配,

df$Namevalue <- ifelse(df$Name %in% df$Name1,
                       df$Name2,
                       NA)
#
     Name   Name1  Name2   Name3 Namevalue
1 Natalie   Shawn Edmund Natalie      <NA>
2 Desmond Desmond  Tyler     Sue     Tyler
3   Kylie   Chris    Tam   Kylie      <NA>
4    Leah  Chewie   Luke    Solo      <NA>

然后创建一列,以显示与name1是否匹配

df$match <- rep(NA, length(df$Namevalue))
df$match[which(!is.na(df$Namevalue))] <- "Name1"
#
     Name   Name1  Name2   Name3 Namevalue match
1 Natalie   Shawn Edmund Natalie      <NA>  <NA>
2 Desmond Desmond  Tyler     Sue     Tyler Name1
3   Kylie   Chris    Tam   Kylie      <NA>  <NA>
4    Leah  Chewie   Luke    Solo      <NA>  <NA>

然后与name3匹配,并将name3(在最后一栏中)分配给与name1不匹配但与name3匹配的值,

df$Namevalue <- ifelse(df$Name %in% df$Name3 & is.na(df$Namevalue),
                       df$Name2,
                       df$Namevalue)
#
df$match[which(is.na(df$match) & !is.na(df$Namevalue))] <- "Name3"
#
     Name   Name1  Name2   Name3 Namevalue match
1 Natalie   Shawn Edmund Natalie    Edmund Name3
2 Desmond Desmond  Tyler     Sue     Tyler Name1
3   Kylie   Chris    Tam   Kylie       Tam Name3
4    Leah  Chewie   Luke    Solo      <NA>  <NA>

其余NA'sname1name3中不匹配。

数据

df <- read.table(text = "
Name      Name1    Name2   Name3    
Natalie   Shawn    Edmund  Natalie   
Desmond   Desmond  Tyler   Sue       
Kylie     Chris    Tam     Kylie     
Leah      Chewie   Luke    Solo", header = T, stringsAsFactor = F)
#
     Name   Name1  Name2   Name3
1 Natalie   Shawn Edmund Natalie
2 Desmond Desmond  Tyler     Sue
3   Kylie   Chris    Tam   Kylie
4    Leah  Chewie   Luke    Solo