【问题标题】:using logical operators with characters使用带字符的逻辑运算符
【发布时间】:2015-09-29 13:29:19
【问题描述】:

我有一个包含三千行的 df,我想创建一个包含零或一的新列,具体取决于用不同的单词写的单词。

我有一个函数可以评估列中的条目,如果它与我要查找的单词匹配,则在新列中返回“1”。像这样:

 oneorzero <- function(x) {
   if (x["col_one"] == "dog") {
     return("1")
   }
   return("0")
 }
 df["col_two"] = apply(df, 1, oneorzero)

我希望能够应用逻辑 OR 运算符,以便在遇到各种不同的单词时添加一个,如下所示:

 oneorzero <- function(x) {
   if (x["col_one"] == "dog" | "cat" | "rat") {
     return("1")
   }
   return("0")
 }
 df["col_two"] = apply(df, 1, oneorzero)

但这当然行不通,因为逻辑运算符只能用于数值。有谁知道这是怎么做到的?

【问题讨论】:

    标签: r character logical-operators


    【解决方案1】:

    您不能对字符使用逻辑运算符,但是,您可以在逻辑语句中使用它们。您的 if 声明应如下所示:

     oneorzero <- function(x) {
       if (x["col_one"] == "dog" | x["col_one"] =="cat" | x["col_one"] =="rat") {
     return("1")
       }
       return("0")
     }
    

    此外,还有一个矢量化版本的if 语句,称为ifelse。它可以让你的代码更加简洁易读:

    df["col_two"]=ifelse(df$col_one=="dog" | df$col_one=="cat" | df$col_one== "rat",1,0)
    

    【讨论】:

      【解决方案2】:

      使用矢量化和%in% 函数(参见help("%in%"),但它应该是不言自明的):

      as.integer(x["col_one"] %in% c("dog", "cat", "rat"))
      

      as.integer 将逻辑值变成 0/1。

      【讨论】:

        【解决方案3】:

        在 R 中使用矢量化解决方案总是比循环更好。对于具有 3K 行的 data.frame,它并不那么重要,但对于较大的行,您会看到性能上有很大差异。

        对于您的问题,我建议使用grepl 函数。

        # lets generate reproducible example
        set.seed(321)
        df <- data.frame(col_one = sapply(1:1e3, function(x) 
          paste(sample(c("dog", "cat", "fox", "rat", "bird", "car", "123"), 
                       sample(1:7, 1), T), collapse = ",")) )
        
        # how does it look like?
        head(df, 10)
        #                         col_one
        # 1  123,cat,car,bird,rat,dog,fox
        # 2               car,rat,cat,123
        # 3                          bird
        # 4                      bird,fox
        # 5                  bird,rat,123
        # 6  rat,123,car,bird,cat,dog,fox
        # 7                      bird,123
        # 8  bird,fox,rat,dog,car,cat,123
        # 9                       rat,car
        # 10     fox,dog,bird,car,rat,cat
        
        df$col_01 <- +(grepl("dog|cat|rat", df$col_one))
        #                          col_one col_01
        # 1    123,cat,cat,fox,fox,rat,fox      1
        # 2               car,bird,fox,car      0
        # 3                           bird      0
        # 4                       bird,fox      0
        # 5                  bird,bird,123      0
        # 6  rat,bird,car,123,rat,dog,bird      1
        # 7                      bird,bird      0
        # 8  bird,rat,car,dog,bird,rat,car      1
        # 9                        rat,123      1
        # 10       fox,dog,123,cat,cat,rat      1
        

        【讨论】:

          猜你喜欢
          • 2020-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          • 1970-01-01
          相关资源
          最近更新 更多