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

如何在R中使用case_when结合字符串检测与列值条件修改数据?

问题分析与修正

你的代码问题出在逻辑运算符的使用和条件组合上,导致所有条目都满足修改条件,最终species全变成了"Other"。

错误原因

原代码中用|(或)连接多个!str_detect条件,这意味着只要不匹配其中任意一个指定字符串,条件就成立。比如Luke Skywalker的名字不匹配全大写的LUKE SKYWALKER,所以!str_detect(name, "LUKE SKYWALKER")为真,整个|组合的条件就会触发,导致他的species也被改成"Other"。实际上任何名字都不可能同时匹配这四个精确大小写的字符串,所以所有条目都会满足修改条件。

修正后的代码

我们需要调整逻辑:同时不匹配Luke Skywalker(忽略大小写)和Darth Vader(忽略大小写),并且物种是人类,才将species改为"Other"。可以用regex()的ignore_case参数简化大小写匹配:

方式一:分开匹配两个名字

library(dplyr)
library(stringr)

starwars %>%
  mutate(
    species = case_when(
      !str_detect(name, regex("Luke Skywalker", ignore_case = TRUE)) &
        !str_detect(name, regex("Darth Vader", ignore_case = TRUE)) &
        species == "Human" ~ "Other",
      .default = species
    )
  )

方式二:合并正则表达式更简洁

starwars %>%
  mutate(
    species = case_when(
      !str_detect(name, regex("Luke Skywalker|Darth Vader", ignore_case = TRUE)) &
        species == "Human" ~ "Other",
      .default = species
    )
  )

效果说明

修正后的代码只会修改:

  • 名字既不是Luke Skywalker(任何大小写形式)也不是Darth Vader(任何大小写形式)
  • 且原species为"Human"的条目,将它们的species改为"Other",其他条目保持原有值不变。

内容的提问来源于stack exchange,提问作者julianas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:20