r语言 - 嵌套的ifelse,返回"else"的原始值?



我有一个嵌套的ifelse语句,如下所示:

combined_data <- original %>%
mutate(new_column = as.character(ifelse(grepl("Apple", list), "Granny Smith Apple",
ifelse(grepl("Banna", list), "Organic Banana",
ifelse(grepl("Spinach", list), "Baby Spinach",
ifelse(grepl("Watermelon", list), "Seedless Watermelon", list))))))

列";列表";有大约10个值。如果它与这些值中的任何一个都不匹配;new_column";值,以返回列表中的内容。例如,如果列list具有:

Apple
Spinach
Watermelon
Orange
Kale

如果我运行上面的并使用list,那么我只得到列表中项目的一个因子,我的输出如下所示:

Granny Smith Apple
Baby Spinach
Seedless Watermelon
5
5

但是new_coulumn应该返回:

Granny Smith Apple
Baby Spinach
Seedless watermelon
Orange
Kale

我怎么能拿到这个?

由于您使用的是dplyr,我强烈建议将case_when作为嵌套ifelse()的更简单的替代方案。(case_when对类型也更严格,因此它会抛出一个关于因子/字符不匹配的错误(。

您代码的case_when版本是这样的:

original %>%
mutate(new_column = case_when(
grepl("Apple", list) ~ "Granny Smith Apple",
grepl("Banna", list) ~ "Organic Banana",
grepl("Spinach", list) ~ "Baby Spinach",
grepl("Watermelon", list) ~ "Seedless Watermelon",
TRUE ~ as.character(list)
))

我也会质疑你是否需要grepl。。。如果您需要在字符串中查找模式,例如,您想将"string containing Apple"更改为"Granny Smith Apple",那么是的,您需要grepl。但是,如果要对整个字符串进行精确匹配,则不需要grepl,只需使用==即可。使用==而不是grepl将更高效,也不易出错(尤其是如果字符串中的字符可能是正则表达式中的特殊字符(。

original %>%
mutate(new_column = case_when(
list == "Apple" ~ "Granny Smith Apple",
list == "Banna" ~ "Organic Banana",
list == "Spinach" ~ "Baby Spinach",
list == "Watermelon" ~ "Seedless Watermelon",
TRUE ~ as.character(list)
))

我修复了它,它返回的是因子而不是字符。

用这个作为我的解决方案:

combined_data <- original %>%
mutate(new_column = as.character(ifelse(grepl("Apple", list), "Granny Smith Apple",
ifelse(grepl("Banna", list), "Organic Banana",
ifelse(grepl("Spinach", list), "Baby Spinach",
ifelse(grepl("Watermelon", list), "Seedless Watermelon", as.character(list)))))))

我们可以使用str_detect,它也是矢量化

library(dplyr)
library(stringr)
original %>%
mutate(new_column = ~ case_when(!str_detect(list, newcol)~ newcol, TRUE ~ list))