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

如何使用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如下:

namesvar
MARY123Ltable
MARYL123.00chair
MARYNLOclothing
MARYNLAclothing
JOHN330chair
JOHNNLAclothing
JOHN123Atable
JOHN123n456.00chair
GEORGEJtable
GEORGEJtable
GEORGEJtable
GEORGENLAclothing

初始代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:10:39