如何对DataFrame进行条件格式化?我的case_when/if_else代码为何报错?
问题与解决方案
问题描述
尝试根据ward字段是否为0来条件生成precinct_name字段,但因操作对象是DataFrame而非向量,使用case_when和if_else时均报错。相关代码及数据结构如下:
报错代码
glimpse(albany_precincts_2023) ## 尝试case_when写法 albany_precincts_2023 <- albany_precincts_2023 %>% case_when(ward == 0 ~ mutate(precinct_name = paste(town_city, election_dist, sep = "-"))) ## 尝试if_else写法 albany_precincts_2023 <- albany_precincts_2023 %>% if_else(ward != 0, mutate(precinct_name = paste(town_city, election_dist, sep = "-")), mutate(precinct_name = paste(town_city, ward, election_dist, sep = "-")))
数据结构
$ town_city <chr> "ALBANY", "ALBANY", "ALBANY", "ALBANY", "ALBANY", "ALBANY", "ALBANY", "ALBANY" $ ward <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3… $ election_dist<int> 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2, 2, 3, 3, 3, 4, 4, 5…
错误原因
case_when和if_else是向量级函数,它们的返回值必须是单个向量,而非对整个DataFrame执行mutate操作。你当前的写法把mutate作为分支返回值,导致类型不匹配(函数期望向量,实际返回DataFrame)。- 逻辑顺序错误:应该用
mutate包裹条件判断函数,而非反过来。
正确代码
方案1:使用case_when
albany_precincts_2023 <- albany_precincts_2023 %>% mutate(precinct_name = case_when( ward == 0 ~ paste(town_city, election_dist, sep = "-"), TRUE ~ paste(town_city, ward, election_dist, sep = "-") ))
方案2:使用if_else
albany_precincts_2023 <- albany_precincts_2023 %>% mutate(precinct_name = if_else( ward == 0, paste(town_city, election_dist, sep = "-"), paste(town_city, ward, election_dist, sep = "-") ))
关键要点
- 核心是在
mutate内部生成新字段,用case_when/if_else对每行的ward值做判断,返回对应字符串向量赋值给precinct_name。 - 确保条件分支返回同类型数据(这里都是字符型),避免类型不兼容报错。
内容的提问来源于stack exchange,提问作者Fred Ditzian
相关产品推荐
相关产品推荐

