R语言Data Frame行列数据归位:大样本数据清洗求助
大规模数据集错位列数据清洗思路提示
当前需处理行数超6位的数据集,核心需求是将错位分布在price、airlines、duration列的价格、航空公司、时长数据,归至对应的正确列。以下是基于数据特征的落地思路:
核心逻辑:利用数据固有特征做规则匹配
三类数据有明确可识别的特征:
- 价格:包含
€符号(无论位于字符串开头或结尾) - 时长:包含
hr/h/min这类时间关键词 - 航空公司:纯文本内容,不含上述两类特征
步骤1:逐行提取并分类数据
对每一行的price、airlines、duration三个单元格,逐个判断所属类别:
- 用正则表达式
grepl("€", x)匹配价格 - 用
grepl("(hr|h|min)", x, ignore.case = TRUE)匹配时长 - 排除前两类的剩余内容即为航空公司名称
步骤2:填充至目标列
将每一行分类后的价格、航空公司、时长,分别赋值给price_right、airline_right、duration_right列。
步骤3:适配百万级数据的性能优化
避免低效循环,采用向量化操作提升速度:
- 用
dplyr的rowwise()+case_when或purrr::pmap逐行批量处理 - 提前编译正则表达式,减少重复匹配的计算开销
- 若数据量极大,改用
data.table框架,其逐行处理性能优于dplyr
示例代码片段
library(dplyr) library(purrr) library(stringr) # 定义单值分类函数 classify_val <- function(x) { case_when( str_detect(x, "€") ~ "price", str_detect(x, "(hr|h|min)") ~ "duration", TRUE ~ "airline" ) } # 批量处理每一行 df_cleaned <- df %>% rowwise() %>% mutate( # 收集当前行三个列的所有值 all_vals = list(c(price, airlines, duration)), # 对每个值分类 val_types = list(map_chr(all_vals, classify_val)), # 提取对应类别的值到目标列 price_right = all_vals[val_types == "price"], airline_right = all_vals[val_types == "airline"], duration_right = all_vals[val_types == "duration"] ) %>% ungroup() %>% select(-all_vals, -val_types)
注意事项
- 边缘情况处理:若某单元格同时包含€和时长关键词(如"100€ 2hr"),需调整正则逻辑或增加优先级判断
- 空值兜底:若某行缺少某类数据,需设置默认值(如
NA)避免报错 - 特征校验:先抽样验证正则规则的准确性,再全量运行
内容的提问来源于stack exchange,提问作者Gaaaa
相关产品推荐
相关产品推荐

