R 基于跨其他列的匹配创建新列,但在NAs出现时忽略它们

R 基于跨其他列的匹配创建新列,但在NAs出现时忽略它们,r,match,R,Match,我试图根据同一行的多个列之间是否存在直接字符匹配来创建一个新列。然后,如果这些列之间存在完全匹配,我想在新列中添加1;如果这些列之间至少有1个不匹配,我想在新列中添加0。下面是一个数据示例: ID var1 var2 var3 1 1 abc def abc 2 2 def xyz jkl 3 3 ghi abc abc 4 4 jkl jkl jkl 5 5

我试图根据同一行的多个列之间是否存在直接字符匹配来创建一个新列。然后,如果这些列之间存在完全匹配,我想在新列中添加1;如果这些列之间至少有1个不匹配,我想在新列中添加0。下面是一个数据示例:

  ID    var1   var2  var3
1     1     abc    def   abc
2     2     def    xyz   jkl
3     3     ghi    abc   abc
4     4     jkl    jkl   jkl
5     5     jkl    jkl   NA
6     6     abc    NA    NA
...
最终的数据应该是这样的

     ID      var1  var2 var3 var_match
1     1     abc    def   abc      0
2     2     def    xyz   jkl      0
3     3     ghi    abc   abc      0
4     4     jkl    jkl   jkl      1
5     5     jkl    jkl   NA       1
6     6     abc    NA    NA       NA
...
我尝试过以下代码:

df$var_match <-0
df <- within(df, { var_match<- ifelse(var1 == var2 & var1== var3, 1, 0) })
df$var\u match一个选项是

i1 <- df$var1 == df[3:4]
df$var_match <- as.integer(!rowSums(!i1, na.rm = TRUE) * 
            NA^(rowSums(is.na(i1)) == 2))
df$var_match
#[1]  0  0  0  1  1 NA
i1一个选项是

i1 <- df$var1 == df[3:4]
df$var_match <- as.integer(!rowSums(!i1, na.rm = TRUE) * 
            NA^(rowSums(is.na(i1)) == 2))
df$var_match
#[1]  0  0  0  1  1 NA

i1在base R中,您可以执行以下操作

df$var_match <- as.integer(                                #convert to 1/0 from TRUE/FALSE
      apply(df[, -1],                                      #run through df, excluding col 1
            1,                                             #by rows
            function(x) {length(unique(x[!is.na(x)])) == 1 #test for one distinct value
                         & sum(!is.na(x)) > 1}))           #but more than one non-NA
df$var_match 1})但不止一个非NA

在base R中,您可以执行以下操作

df$var_match <- as.integer(                                #convert to 1/0 from TRUE/FALSE
      apply(df[, -1],                                      #run through df, excluding col 1
            1,                                             #by rows
            function(x) {length(unique(x[!is.na(x)])) == 1 #test for one distinct value
                         & sum(!is.na(x)) > 1}))           #but more than one non-NA
df$var_match 1})但不止一个非NA

最后一列呢?当var2和VAR3中只有NAs时,我想保留NA,因为没有可匹配的内容?@KaylaFinch抱歉,我很忙。更新了帖子没有问题。为了便于说明,我简化了数据框,使其与其他两列中的一列相匹配,但实际上,我需要查看是否在6列中找到此值。我尝试了您的代码,但将NA^(rowSums(is.NA(i1))==2))值更改为6,并且在最后一列中只得到了NAs。知道发生了什么吗?@Kayla只有当该行的所有6列行都为NA时才会发生这种情况。你能检查一下
i1
没关系,发现了问题。看起来代码有效,谢谢!最后一个专栏呢?当var2和VAR3中只有NAs时,我想保留NA,因为没有可匹配的内容?@KaylaFinch抱歉,我很忙。更新了帖子没有问题。为了便于说明,我简化了数据框,使其与其他两列中的一列相匹配,但实际上,我需要查看是否在6列中找到此值。我尝试了您的代码,但将NA^(rowSums(is.NA(i1))==2))值更改为6,并且在最后一列中只得到了NAs。知道发生了什么吗?@Kayla只有当该行的所有6列行都为NA时才会发生这种情况。你能检查一下
i1
没关系,发现了问题。看起来代码有效,谢谢!