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

R数据整理:匹配因子列特定字符串提取数值并按值复制行

R语言数据清洗实现方案

实现逻辑

  • 先将因子类型的pastries.Baked列转为字符类型,方便后续正则操作
  • 提取x/X后的原始数量值,作为行重复的次数依据
  • 将pastries.Baked列中x/X后的数量统一替换为1
  • 按照原始数量值重复对应行,得到最终结果

tidyverse 实现代码

library(tidyverse)

# 构造示例输入数据
df <- data.frame(bakery.ID = 1:4, 
                 pastries.Baked = c('Large Cake x 3', 'Large Cake x 1', 'Large Cake x 2', 'Medium Cake x 1'))

df_result <- df %>%
  # 因子转字符,适配正则操作
  mutate(pastries.Baked = as.character(pastries.Baked)) %>%
  # 提取x/X后的原始数量,ignore_case = TRUE适配大小写X的匹配要求
  mutate(count = as.integer(str_extract(pastries.Baked, regex("(?<=x\\s)\\d+", ignore_case = TRUE)))) %>%
  # 将x后的数值替换为1
  mutate(pastries.Baked = str_replace(pastries.Baked, regex("(?<=x\\s)\\d+", ignore_case = TRUE), "1")) %>%
  # 按原始数量重复行
  uncount(count)

base R 实现代码

# 构造示例输入数据
df <- data.frame(bakery.ID = 1:4, 
                 pastries.Baked = c('Large Cake x 3', 'Large Cake x 1', 'Large Cake x 2', 'Medium Cake x 1'))

# 因子转字符
df$pastries.Baked <- as.character(df$pastries.Baked)
# 忽略大小写提取原始数量
count <- as.integer(sub(".*[xX]\\s(\\d+)", "\\1", df$pastries.Baked))
# 替换数量为1
df$pastries.Baked <- sub("([xX]\\s)\\d+", "\\11", df$pastries.Baked)
# 按原始数量重复行
df_result <- df[rep(seq_len(nrow(df)), count), ]

执行上述代码后输出的df_result与期望结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:57:01