R не распознает оператор if при создании нового столбца - PullRequest
1 голос
/ 31 мая 2019

Я пытаюсь создать новый столбец, основываясь на том, есть ли прямое совпадение символов в 3 столбцах одной строки.Затем я хочу поставить 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   def
5     4     jkl    jkl   NA
...

Вот код, который у меня есть:

   prodprov$var_match <- 0
    for(i in 1:nrow(prodprov)) {
     if(prodprov$var1[i] == prodprov$var2[i] |
     prodprov$var1[i] == prodprov$var3[i] ) {
     prodprov$var_match <- 1
     }
    }

Но я получаю эту ошибку: Ошибка в if (prodprov $ var1 [i] == prodprov$ var2 [i] |: пропущенное значение, где требуется ИСТИНА / ЛОЖЬ

Конечный фрейм данных должен выглядеть примерно так:

     ID      var1  var2 var3 var_match
1     1     abc    def   abc      1
2     2     def    xyz   jkl      0
3     3     ghi    abc   abc      0
4     4     jkl    jkl   def      1
5     4     jkl    jkl   NA       1
...

Есть идеи, как это исправить? Все этипеременные одного типа данных (символы). Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Опция будет Reduce с |

as.integer(Reduce(`|`, lapply(df1[-(1:2)], `==`, df1$var1)))

Или опция с rowSums

df1$var_match <- as.integer( rowSums(df1[c('var2', 'var3')] == 
             rep(df1$var1,  2)) > 0)
df1$var_match
#[1] 1 0 0 1

Данные

df1 <- structure(list(ID = 1:4, var1 = c("abc", "def", "ghi", "jkl"), 
    var2 = c("def", "xyz", "abc", "jkl"), var3 = c("abc", "jkl", 
    "abc", "def")), class = "data.frame", row.names = c("1", 
"2", "3", "4"))
0 голосов
/ 31 мая 2019

Вы можете воспользоваться векторизацией в R:

df$var_match <- df$var1 == df$var2 | df$var1 == df$var3

Результат:

df
#   var1 var2 var3 var_match
# 1  abc  def  abc      TRUE
# 2  def  xyz  jkl     FALSE
# 3  ghi  abc  abc     FALSE
# 4  jkl  jkl  def      TRUE
# 5  jkl  jkl <NA>      TRUE

Фрейм входных данных для полноты:

df <- data.frame(stringsAsFactors = FALSE,
  var1 = c("abc", "def", "ghi", "jkl", "jkl"),
  var2 = c("def", "xyz", "abc", "jkl", "jkl"),
  var3 = c("abc", "jkl", "abc", "def", NA)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...