You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:32:22