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

