[英]Vectorizing multiple if statements in a function
我正在嘗試創建一個函數,該函數接收一個單詞並根據該單詞所屬的組返回一個數字,我創建了以下函數,該函數僅適用於單個輸入:
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()
情況下制作此函數的矢量化版本?
這是一個選項。 關鍵是將您的組存儲在您可以循環/應用/映射的列表中。
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
,它只是在單行中完成。
purrr::detect_index(groups, ~ x %in% ., .dir = "backwards")
注意默認情況下, detect_index
將返回謂詞為真的第一個索引。 由於您想要最后一個索引,您需要指定.dir = "backwards"
。
這是 for 循環在R
實際上有意義的示例之一,因為您不想要所有可能的返回值的列表,並且如果您找到了正確的返回值,則不需要其他的。 那么,這個怎么樣:
get_humor <- function(x, groupList)
for (i in seq_along(groupList)){
if (x %in% groupList[[i]]) return(i)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.