如何高效从非标准日期数据中提取年、月、日列?
高效提取非标准日期的年、月、日列
针对十万行以上的大数据集,逐行循环的sapply方法效率低下,推荐以下两种向量化/高效处理方案:
方案1:使用tidyr::separate(tidyverse生态)
separate是专门用于拆分列的函数,底层为向量化实现,处理速度远快于逐行循环:
library(tidyr) dates_df <- data.frame(dates = c("1985-03-23", "", "1983", "1984-01")) # 拆分dates列,缺失部分用NA填充,保留原列 dates_df <- separate(dates_df, col = dates, into = c("year", "month", "day"), sep = "-", fill = "right", remove = FALSE) # 将空字符串转为NA,匹配期望结果 dates_df[dates_df == ""] <- NA
该方法代码简洁,适合习惯tidyverse工作流的用户。
方案2:使用data.table::tstrsplit(大数据最优选择)
data.table专为大数据处理优化,tstrsplit是其内置的快速字符串拆分函数,在十万甚至百万行数据上的处理速度会比tidyr更有优势:
library(data.table) dates_df <- data.frame(dates = c("1985-03-23", "", "1983", "1984-01")) # 转换为data.table对象 setDT(dates_df) # 拆分dates列并生成新列 dates_df[, c("year", "month", "day") := tstrsplit(dates, "-", fixed = TRUE)] # 空值转NA dates_df[dates == "", c("year", "month", "day") := NA]
性能优势说明
原代码中的sapply本质是逐行遍历处理,属于低效的循环操作;而separate和tstrsplit都是向量化操作,底层通过C语言实现批量处理,避免了逐行循环的性能损耗,在大数据集上的速度提升非常明显。
内容的提问来源于stack exchange,提问作者flee
相关产品推荐
相关产品推荐

