将Excel嵌套函数转换为R代码



请帮助将Excel嵌套函数转换为R代码IF(ISNUMBER(SEARCH("Unknown",D1134)),1,if(ISNUMBER(SEARCH("<1",D1134)),2,IF(ISNUMBER(SEARCH("1-4",D1134)),3,IF(ISNUMBER(SEARCH("5-9",D1134)),4,IF(ISNUMBER(SEARCH("10-14",D1134)),5,IF(ISNUMBER(SEARCH("15-19",D1134)),6,IF(ISNUMBER(SEARCH("20-24",D1134)),7,IF(ISNUMBER(SEARCH("25-29",D1134)),8,IF(ISNUMBER(SEARCH("30-34",D1134)),9,IF(ISNUMBER(SEARCH("35-39",D1134)),10,IF(ISNUMBER(SEARCH("40-44",D1134)),11,IF(ISNUMBER(SEARCH("45-49",D1134)),12,IF(ISNUMBER(SEARCH("50+",D1134)),13,"")))))))))))))

我认为您可以在这里使用dplyr::case_when。我假设你有一个向量vec,它可能是自己,也可能是一个帧的列(在这种情况下,它可能在dplyr管道或类似的管道中,交给你(。

library(dplyr)
ptns <- c("Unknown", "<1", "5-9", "10-40")
mydata <- data.frame(vec = c("Unknown results", "The team won 10-40", "My height in feet is between 5-9", "IDK"))
mydata %>%
mutate(newcol = case_when(
grepl("Unknown", vec, fixed = TRUE) ~ 1L, 
grepl("<1", vec, fixed = TRUE) ~ 2L, 
grepl("5-9", vec, fixed = TRUE) ~ 3L, 
grepl("10-40", vec, fixed = TRUE) ~ 4L, 
TRUE ~ -1L)
)
#                                vec newcol
# 1                  Unknown results      1
# 2               The team won 10-40      4
# 3 My height in feet is between 5-9      3
# 4                              IDK     -1

另一种选择是,如果你有一个模式向量,只关心第一个匹配。

mydata %>%
mutate(
newcol = apply(sapply(c(ptns, ""), grepl, x = vec), 1, which.max),
newcol = if_else(newcol > length(ptns), NA_integer_, newcol)
)
#                                vec newcol
# 1                  Unknown results      1
# 2               The team won 10-40      4
# 3 My height in feet is between 5-9      3
# 4                              IDK     NA

最新更新