如何使用dplyr在R中根据现有列值生成指定规则的新列?
使用dplyr根据字符串结尾规则生成新列
初始数据框
我有如下结构的data frame:
| names |
|---|
| MARY123L |
| MARYL123.00 |
| MARYNLO |
| MARYNLA |
| JOHN330 |
| JOHNNLA |
| JOHN123A |
| JOHN123n456.00 |
| GEORGEJ |
| GEORGEJ |
| GEORGEJ |
| GEORGENLA |
生成新列规则
需要创建一个新列var,根据names列的元素值按以下规则返回对应内容:
- 若元素以
NLA或NLO结尾,返回"clothing" - 若元素以字母结尾,返回"table"
- 若元素以数字结尾,返回"chair"
注意:规则优先级很关键,
NLA/NLO结尾的情况必须优先判断,因为它们本身也属于以字母结尾的范畴,放在后面会被覆盖。
期望结果
最终得到的data frame如下:
| names | var |
|---|---|
| MARY123L | table |
| MARYL123.00 | chair |
| MARYNLO | clothing |
| MARYNLA | clothing |
| JOHN330 | chair |
| JOHNNLA | clothing |
| JOHN123A | table |
| JOHN123n456.00 | chair |
| GEORGEJ | table |
| GEORGEJ | table |
| GEORGEJ | table |
| GEORGENLA | clothing |
初始代码
library(tidyverse) names = c("MARY123L","MARYL123.00","MARYNLO","MARYNLA", "JOHN330","JOHNNLA","JOHN123A","JOHN123n456.00","GEORGEJ","GEORGEJ","GEORGEJ","GEORGENLA") DATA = tibble(names);DATA
请问如何使用R中的dplyr包实现该需求?
解决方案
可以使用dplyr的case_when()函数结合正则表达式实现,核心是按优先级顺序编写判断条件:
library(tidyverse) names = c("MARY123L","MARYL123.00","MARYNLO","MARYNLA", "JOHN330","JOHNNLA","JOHN123A","JOHN123n456.00","GEORGEJ","GEORGEJ","GEORGEJ","GEORGENLA") DATA = tibble(names) # 生成新列var DATA = DATA %>% mutate(var = case_when( # 优先匹配NLA/NLO结尾的情况 str_detect(names, "NLA$|NLO$") ~ "clothing", # 匹配以任意大小写字母结尾的情况 str_detect(names, "[A-Za-z]$") ~ "table", # 匹配以数字结尾的情况 str_detect(names, "\\d$") ~ "chair", # 兜底处理未匹配到的情况,返回NA TRUE ~ NA_character_ )) # 查看结果 DATA
代码说明
case_when()按顺序执行判断,前面的条件匹配成功后就不会再执行后续条件,因此必须把优先级高的规则放在最前面。str_detect()结合正则表达式:NLA$|NLO$:$表示字符串结尾,匹配末尾为NLA或NLO的内容。[A-Za-z]$:匹配末尾为任意大小写字母的内容。\\d$:\\d代表数字,匹配末尾为数字的内容。
- 最后
TRUE ~ NA_character_用于处理所有未命中上述规则的情况,可根据需求修改为其他默认值。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

