R在创建新列时无法识别if语句

时间:2019-05-31 17:17:44

标签: r if-statement

我正在尝试基于同一行的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] |:   缺少需要TRUE / FALSE的值

最终数据框应如下所示:

     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 个答案:

答案 0 :(得分:1)

选项为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"))

答案 1 :(得分:0)

您可以利用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)
)