R 向量化函数中的多个if语句
我试图创建一个函数,该函数接收一个单词并根据该单词所属的组返回一个数字,我创建了以下函数,该函数仅适用于单个输入:R 向量化函数中的多个if语句,r,function,if-statement,vectorization,R,Function,If Statement,Vectorization,我试图创建一个函数,该函数接收一个单词并根据该单词所属的组返回一个数字,我创建了以下函数,该函数仅适用于单个输入: 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
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)
}
但是有一种方法可以在不使用其他辅助函数的情况下生成此函数的矢量化版本,例如
lappy()
或Vectorize()
?这里有一个选项。关键是将您的组存储在一个列表中,您可以在该列表上循环/应用/映射
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))
}
注意:默认情况下,
detect\u index
将返回谓词为真的第一个索引。由于需要最后一个索引,因此需要指定.dir=“backwards”
这是在R
中实际使用for循环的示例之一,因为您不需要所有可能返回值的列表,如果找到了正确的值,则不需要其他值。那么,这个怎么样:
get_humor <- function(x, groupList)
for (i in seq_along(groupList)){
if (x %in% groupList[[i]]) return(i)
}
}
get\u humorsapply(单词列表,乐趣=函数(x)ifelse(x%在%nv5,5,ifelse中)(x%在%nv4,4,ifelse中)(x%在%nv3,3,ifelse中)(x%在%nv2,2,1中);)
ifelse
是矢量化的,但您可能在逻辑循环方面遇到问题,如果您将一个向量x
与另一个向量进行比较,其中%in%
可能dplyr::case\u when()
要进行矢量化,您应该使用组列表:组请提供一个可复制的示例。我认为您可以使用单个匹配语句将其矢量化建议重复:
purrr::detect_index(groups, ~ x %in% ., .dir = "backwards")
get_humor <- function(x, groupList)
for (i in seq_along(groupList)){
if (x %in% groupList[[i]]) return(i)
}
}