【问题标题】:Vectorizing multiple if statements in a function向量化函数中的多个 if 语句
【发布时间】:2020-04-10 01:03:46
【问题描述】:

我正在尝试创建一个函数,该函数接收一个单词并根据该单词所属的组返回一个数字,我创建了以下函数,该函数仅适用于单个输入:

get_humor <- function(x) {

  feeling <- str_to_lower(x)

  if (x %in% group5) return(5)
  if (x %in% group4) return(4)
  if (x %in% group3) return(3)
  if (x %in% group2) return(2)
  if (x %in% group1) return(1)


}

我知道我可以使用嵌套的 ifelses,像这样:

ifelse(x %in% nv5, 5, 
         ifelse(x %in% nv4, 4,
                ifelse(x %in% nv3, 3,
                       ifelse(x %in% nv2, 2, 1))))

但是有一种方法可以在不使用其他辅助函数(如lapply()Vectorize())的情况下制作此函数的矢量化版本?

【问题讨论】:

  • sapply(word_list, FUN = function(x) ifelse(x %in% nv5, 5, ifelse(x %in% nv4, 4, ifelse(x %in% nv3, 3, ifelse(x %in% nv2, 2, 1))))) 应该可以解决问题。 ifelse 矢量化的,但是如果您将矢量x 与另一个带有%in% 的矢量进行比较,您可能会遇到逻辑回收问题。
  • 也许dplyr::case_when()
  • 为了矢量化,您应该使用组列表:groups &lt;- list(group1, group2, ..., group5)
  • 请提供一个可重现的例子。我认为您可以使用单个 match 语句将其矢量化

标签: r function if-statement vectorization


【解决方案1】:

这是一个选项。关键是将您的组存储在一个列表中,您可以在该列表上循环/应用/映射。

groups <- list(group1, group2, group3, group4, group5)

# Using apply
get_humor <- function(x, groups) {
  x_in <- sapply(groups, function(g) x %in% g)
  max(which(x_in))
}

# Using purrr
get_humor <- function(x, groups) {
  x_in <- purrr::map_lgl(groups, function(g) x %in% g)
  max(which(x_in))
}

这会检查x 属于哪些组并返回最高的组索引。

另一种选择是在找到组后立即返回。这可以通过for 循环来完成,也可以通过purrr 中的detect_index 来完成,这只是在单行中完成。

purrr::detect_index(groups, ~ x %in% ., .dir = "backwards")

注意默认情况下detect_index 将返回谓词为真的第一个 索引。由于你想要 last 索引,你需要指定.dir = "backwards"

【讨论】:

    【解决方案2】:

    这是在R 中真正有意义的 for 循环的示例之一,因为您不需要所有可能返回值的列表,并且如果您找到了正确的返回值,则不需要其他返回值。那么,这个怎么样:

    get_humor <- function(x, groupList)
        for (i in seq_along(groupList)){
            if (x %in% groupList[[i]]) return(i)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多