与ifelse语句超限
问题:我写了超过100 ifelse
陈述一个巨大的一段代码,不仅要学习,有上ifelse
报表数量限制:超过50引发错误。无论如何,我知道有一种更有效的方式来做我想做的事情。与ifelse语句超限
目标:试图编写一个函数,将许多字符串变体(参见下面的例子)重新编码为清晰的类别(例如下面)。我使用str_detect
给T/F,然后根据响应更改为正确的类别。我怎么能没有超过100 ifelse
陈述(我有更多的类别)。
例子:
mydf <- data_frame(answer = sample(1:5, 10, replace = T),
location = c("at home", "home", "in a home",
"school", "my school", "School", "Work", "work",
"working", "work usually"))
loc_function <- function(x) {
home <- "home"
school <- "school"
work <- "work"
ifelse(str_detect(x, regex(home, ignore_case = T)), "At Home",
ifelse(str_detect(x, regex(school, ignore_case = T)), "At
School",
ifelse(str_detect(x, regex(work, ignore_case = T)), "At
Work", x)))
}
### Using function to clean up messy strings (and recode first column too) into clean categories
mycleandf <- mydf %>%
as_data_frame() %>%
mutate(answer = ifelse(answer >= 2, 1, 0)) %>%
mutate(location = loc_function(location)) %>%
select(answer, location)
mycleandf
# A tibble: 10 x 2
answer location
<dbl> <chr>
1 1 At Home
2 1 At Home
3 1 At Home
4 1 At School
5 1 At School
6 1 At School
7 1 At Work
8 0 At Work
9 1 At Work
10 0 At Work
你可以把你的模式在一个名为向量,(注意Other = ""
,这是一个秋天回来的时候没有你的模式匹配字符串):
patterns <- c("At Home" = "home", "At School" = "school", "At Work" = "work", "Other" = "")
然后循环图案并检查字符串是否包含图案:
match <- sapply(patterns, grepl, mydf$location, ignore.case = T)
Fin盟友建立新列买检查匹配的模式这是你要替换的人,如果没有匹配,回落到其他的名字:
mydf$clean_loc <- colnames(match)[max.col(match, ties.method = "first")]
mydf
# A tibble: 10 x 3
# answer location clean_loc
# <int> <chr> <chr>
# 1 3 at home At Home
# 2 3 home At Home
# 3 3 in a home At Home
# 4 3 school At School
# 5 2 my school At School
# 6 4 School At School
# 7 5 Work At Work
# 8 1 work At Work
# 9 2 working At Work
#10 1 work usually At Work
非常有帮助。如果我有一个匹配两个字符串的字符串,我怎么才能正确排序呢? EG:“当时在家工作”我想归类为“在工作中”。调整模式或匹配的逻辑顺序? –
您可以调节模式的顺序,把你想要那些你不前优先考虑的模式。所以,如果你在'At Home'前面加上'At Work',它会给你'At Work'。 – Psidom
不是嵌套的条件,你可以依次执行它们。使用for
循环:
# Store the find-replace pairs in a data frame
word_map <- data.frame(pattern = c("home", "school", "work"),
replacement = c("At Home", "At School", "At Work"),
stringsAsFactors = FALSE)
word_map
pattern replacement
1 home At Home
2 school At School
3 work At Work
# Iterate through the pairs
for (i in 1:nrow(word_map)) {
pattern <- word_map$pattern[i]
replacement <- word_map$replacement[i]
mydf$location <- ifelse(grepl(pattern, mydf$location, ignore.case = TRUE), replacement, mydf$location)
}
mydf
answer location
1 4 At Home
2 4 At Home
3 1 At Home
4 5 At School
5 1 At School
6 2 At School
7 5 At Work
8 2 At Work
9 1 At Work
10 3 At Work
https://www.tutorialspoint.com/r/r_switch_statement.htm – Kai
*超过100 ifelse语句*当你发现自己需要比的东西屈指可数,你应该开始思考关于寻找更好的方法。当你达到两把时,你应该开始考虑你做错了什么。如果你认为你有一辆独轮车,**知道你已经完全搞砸了,需要寻求帮助。你已经达到了翻车水平。 –
听起来像你想要使用case_when语句,或者使用purr:map()将函数映射到所有单词以使其成为标题大小写? – petergensler