R语言数据集清洗技术问询:移除数值列文本行及拆分ast.range列
针对R语言数据清洗的实用方案建议
Hey there! 作为R语言新手,你已经抓准了数据清洗里两个超关键的步骤——清理脏数据和结构化列,这起点真的很棒!我来给你分享具体的实现方法,再补充几个能让数据更干净一致的实用技巧:
一、移除数值列中包含文本值的行
数值列混进文本是新手常遇到的问题,这里有两种靠谱的处理方式:
- 批量转换+过滤NA:利用
dplyr的批量处理能力,把目标列转成数值型(转不了的文本会变成NA),再过滤掉带NA的行:
library(dplyr) # 假设你的数据框是df,要处理的数值列是col1、col2 clean_df <- df %>% mutate(across(c(col1, col2), ~ as.numeric(.x))) %>% filter(if_all(c(col1, col2), ~ !is.na(.x)))
这种方法简单高效,适合已经明确哪些列应该是数值型的场景。
- 先排查再过滤:如果你想先定位到底哪些行有问题(方便后续排查数据源头),可以用正则表达式检测非数字内容:
# 给数据框加一列标记,检查col1是否包含非数字字符(允许小数点和负号) df$has_invalid_text <- grepl("[^0-9.-]", df$col1) # 过滤掉有问题的行,再删掉标记列 clean_df <- df %>% filter(!has_invalid_text) %>% select(-has_invalid_text)
二、拆分ast.range列为astUpper和astLower
假设你的ast.range列格式是类似"12-30"或者"4.5-18.2"这样的范围值,用tidyr的separate函数就能一步搞定:
library(tidyr) clean_df <- clean_df %>% separate(ast.range, into = c("astLower", "astUpper"), sep = "-", convert = TRUE)
这里sep = "-"指定了分隔符,convert = TRUE会自动把拆分后的两列转成数值型,省得你再手动转换类型。如果你的分隔符是其他符号(比如"/"),替换成对应的就行。
三、其他获取干净一致数据的实用技巧
除了你已经在做的,还有几个步骤能帮你把数据打磨得更规整:
智能处理缺失值:不要一看到NA就删除,根据数据情况选择填充方式更合理:
- 数值列可以用均值/中位数填充:
clean_df <- clean_df %>% mutate(across(where(is.numeric), ~ if_else(is.na(.x), mean(.x, na.rm = TRUE), .x))) - 分类列可以用众数填充,先写个简单的众数函数:
get_mode <- function(x) { ux <- unique(x) ux[which.max(tabulate(match(x, ux)))] } clean_df <- clean_df %>% mutate(across(where(is.factor), ~ if_else(is.na(.x), get_mode(.x), .x)))
- 数值列可以用均值/中位数填充:
标准化列名:统一列名格式(比如全小写、用下划线代替空格),能避免后续写代码时因为列名格式混乱出错:
# 用janitor包一键标准化 library(janitor) clean_df <- clean_df %>% clean_names() # 手动处理的话也可以这样 colnames(clean_df) <- tolower(gsub(" ", "_", colnames(clean_df)))去除重复行:数据集里经常会藏着重复记录,用
distinct()快速去重:# 去除完全重复的行 clean_df <- clean_df %>% distinct() # 如果只想根据某几列判断重复(比如id列),保留第一条记录 clean_df <- clean_df %>% distinct(id, .keep_all = TRUE)验证并修正数据类型:确保每列的类型符合预期,比如日期列要转成Date类型,不然后续做时间分析会踩坑:
# 把字符串格式的日期转成Date类型 clean_df$record_date <- as.Date(clean_df$record_date, format = "%Y-%m-%d") # 检查所有列的类型,确认没问题 str(clean_df)
内容的提问来源于stack exchange,提问作者Krutika Desai
相关产品推荐
相关产品推荐

