如何在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
相关产品推荐
相关产品推荐

