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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:36:23