Создание нового столбца на основе совпадений в других столбцах, но игнорируя NA, когда они появляются - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь создать новый столбец, основываясь на том, есть ли прямое совпадение символов в нескольких столбцах одной строки.Затем я хочу поставить 1 в новом столбце, если между этими столбцами есть полное совпадение, или 0, если в столбцах есть хотя бы 1 несоответствие.Вот пример данных:

  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) })

Но этоне работает с NA (как показано в строке 5) - в результате я получу NA вместо желаемого 1. Дайте мне знать, есть ли способ обойти это.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

В базе 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
0 голосов
/ 03 июня 2019

Опция будет

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

data

df <- structure(list(ID = 1:6, var1 = c("abc", "def", "ghi", "jkl", 
"jkl", "abc"), var2 = c("def", "xyz", "abc", "jkl", "jkl", NA
), var3 = c("abc", "jkl", "abc", "jkl", NA, NA)), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...