【问题标题】:Compare strings with logical operator in R将字符串与 R 中的逻辑运算符进行比较
【发布时间】:2015-08-11 17:59:59
【问题描述】:

我在尝试使用 R 比较和设置工作日字符串值作为“周末”或“工作日”时遇到错误。任何有关如何以更好的方式解决此问题的建议都会很棒。

x <- c("Mon","Tue","Wed","Thu","Fri","Sat","Sun")

setDay <- function(day){
          if(day == "Sat" | "Sun"){
           return("Weekend")
          } else { 
            return("Weekday")
          }
        }

sapply(x, setDay)

这是我在 RStudio 中返回的错误:

Error in day == "Sat" | "Sun" : 
  operations are possible only for numeric, logical or complex types

【问题讨论】:

  • 一次只能进行一项比较。试试day == "Sat" | day == "Sun"
  • @Benjamin 这不完全正确,day %in% c("Sat","Sun") 是另一种选择。
  • @Benjamin 除了你可以...day %in% c("Sat","Sun")...
  • 好吧,如果你想进行明显的修正,当然可以。 :)
  • 另外,请查看 related answers 了解您正在烘干的内容的内置版本

标签: r string function compare logical-operators


【解决方案1】:

您可以使用ifelse%in% 在单个矢量化操作中执行此操作,而不是使用sapply 循环遍历x 中的每一天并检查是工作日还是周末:

ifelse(x %in% c("Sat", "Sun"), "Weekend", "Weekday")
# [1] "Weekday" "Weekday" "Weekday" "Weekday" "Weekday" "Weekend" "Weekend"

这里使用向量化操作的动机是双重的——它可以节省你的打字时间,它会让你的代码更有效率。

【讨论】:

  • 作为对ifelse的反击:c("Weekend", "Weekday")[1L+x %in% c("Sat", "Sun")]
  • @Frank 我理解这种表达的动机,而不是ifelse,但我发现它的可读性要差很多。
  • 我和你在一起;只是试图用这种方法防止不必要的答案:)
  • 另外,如果%in%语法让你感到困惑,你可以使用is.element()(虽然占用更多字符)
  • 一旦我们开始允许周日、周六、周六等,就该进行正则表达式了:ifelse(grepl("sun|sat",tolower(x)),"Weekend","Weekday")
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 2021-09-09
  • 2018-05-18
  • 2014-07-15
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多