R 嵌套的ifelse,是否返回“else”的原始值?

R 嵌套的ifelse,是否返回“else”的原始值?,r,dplyr,R,Dplyr,我有一个嵌套的ifelse语句,如下所示: combined_data <- original %>% mutate(new_column = as.character(ifelse(grepl("Apple", list), "Granny Smith Apple", ifelse(grepl("Banna", list), "Organi

我有一个嵌套的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))))))
Granny Smith Apple
Baby Spinach
Seedless Watermelon
5
5
如果我运行上面的和uselist,那么我只得到列表中项目的一个因子,我的输出如下所示:

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))))))
Granny Smith Apple
Baby Spinach
Seedless Watermelon
5
5
但新专栏应该回归:

Granny Smith Apple
Baby Spinach
Seedless watermelon
Orange
Kale

我怎么能得到这个呢?

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

将此用作我的解决方案:

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)))))))

我修复了它,它返回的是因子而不是角色

将此用作我的解决方案:

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))
我们可以使用str_detect,它也是矢量化的

library(dplyr)
library(stringr)
original %>%
    mutate(new_column = ~ case_when(!str_detect(list, newcol)~ newcol, TRUE ~ list))
因为您使用的是dplyr,所以我强烈建议将case_when作为嵌套ifelse的更简单的替代方案。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)
  ))
我也会质疑你是否需要格雷普。。。如果您需要查找字符串中的模式,例如,您想将包含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)
  ))
因为您使用的是dplyr,所以我强烈建议将case_when作为嵌套ifelse的更简单的替代方案。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)
  ))
我也会质疑你是否需要格雷普。。。如果您需要查找字符串中的模式,例如,您想将包含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)
  ))

为什么不将未更改的项添加到描述符列表中以消除对更复杂编码逻辑的需求?为什么不将未更改的项添加到描述符列表中以消除对更复杂编码逻辑的需求?