使用ifelse与dplyr::mutate为R语言DataFrame新增列失败求助
问题解决与代码优化
1. 核心问题:未保存mutate结果
dplyr的mutate()不会直接修改原DataFrame,而是返回带新列的新对象。你的代码仅执行了mutate操作,但未将结果重新赋值给stats,因此原DataFrame没有变化。
修复方法:将mutate的结果重新赋值给stats:
stats <- stats %>% mutate(newColumn = # 你的条件逻辑 ))
也可以使用magrittr包的赋值管道%<>%(需先加载包):
library(magrittr) stats %<>% mutate(newColumn = ...)
2. 优化嵌套ifelse:用case_when替代
多层嵌套ifelse可读性差且易出错,推荐用dplyr的case_when()简化逻辑:
library(dplyr) stats <- stats %>% mutate(newColumn = case_when( # 匹配2015_16的所有条件 columnInDataframe %in% c(201503, 201508, 201510, 201601) ~ "2015_16", # 匹配2016_17的所有条件 (columnInDataframe == 201603 & ExistingColumn %in% c(2018, 2019)) | (columnInDataframe %in% c(201608, 201610, 201701, 201703) & ExistingColumn == 2018) ~ "2016_17", # 匹配2017_18的所有条件 (columnInDataframe == 201703 & ExistingColumn == 2019) | columnInDataframe %in% c(201708, 201710, 201801) | (columnInDataframe == 201803 & ExistingColumn == 2019) ~ "2017_18", # 匹配2018_19的所有条件 (columnInDataframe == 201803 & ExistingColumn == 2020) | columnInDataframe %in% c(201808, 201810, 201901) | (columnInDataframe == 201903 & ExistingColumn == 2020) ~ "2018_19", # 匹配2019_20的所有条件 (columnInDataframe == 201903 & ExistingColumn == 2021) | columnInDataframe %in% c(201908, 201910, 202001) | (columnInDataframe == 202003 & ExistingColumn == 2021) ~ "2019_20", # 匹配2020_21的所有条件 (columnInDataframe == 202003 & ExistingColumn == 2022) | columnInDataframe %in% c(202008, 202010, 202101) | (columnInDataframe == 202103 & ExistingColumn == 2022) ~ "2020_21", # 匹配2021_22的所有条件 (columnInDataframe == 202103 & ExistingColumn == 2023) | columnInDataframe %in% c(202108, 202110, 202201) | (columnInDataframe == 202203 & ExistingColumn == 2023) ~ "2021_22", # 所有不匹配的情况返回NA TRUE ~ NA_character_ )) print(stats)
3. 导出到电子表格
确认新列添加成功后,可导出为csv或xlsx文件:
# 导出为CSV write.csv(stats, "updated_name.csv", row.names = FALSE) # 导出为XLSX(需先安装writexl包) # install.packages("writexl") library(writexl) write_xlsx(stats, "updated_name.xlsx")
内容的提问来源于stack exchange,提问作者corvairlover
相关产品推荐
相关产品推荐

