Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于双变量的条件匹配_R - Fatal编程技术网

R 基于双变量的条件匹配

R 基于双变量的条件匹配,r,R,我有一个具有类似多行和多列的DF。我想将Name与Name1匹配。如果Name与Name1不匹配,我还想尝试将Name与Name3匹配。然后,如果匹配,我希望Name2的值作为新变量Namevalue返回 df Name Name1 Name2 Name3 Natalie Shawn Edmund Natalie Desmond Desmond James Sue Kylie Kylie Brent Manny 期望输出 df Nam

我有一个具有类似多行和多列的DF。我想将
Name
Name1
匹配。如果
Name
Name1
不匹配,我还想尝试将
Name
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
我试过这个:

Merge1$Namevalue <- ifelse(Merge1$Name %in% Merge1$Name1, Merge1$Name2, 
                    paste("Unknown"),
                    ifelse(Merge1$Name %in% Merge1$Name3, Merge1$Name2, paste("Unknown"))
Merge1$Namevalue您的
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>
然后创建一列,显示是否与
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>
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>
剩余的
NA的
name1
name3
中没有匹配项

数据

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

df谢谢你。在我看到你的帖子之前,我已经做到了这一点(这让我觉得自己有点胜任)。我遇到的问题是,它返回的值必须是它匹配的精确关联行。我过去不需要使用OR条件的代码是:DF$Namevalue不幸的是,我现在不在计算机旁。一种方法是将其拆分为两个ifelse()语句。首先与name1匹配,并将1分配给另一列。然后再次与另一条ifelse()语句匹配,剩余的NA不匹配,新列指示您在第一次运行时是否匹配(使用名称1)。谢谢。不要着急。我可以等你的专家回答。
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