如何用readr::read_table读取表头列数不匹配文件并合并日期时间列
解决readr::read_table表头与数据列数不匹配的问题
我有一批格式特殊的文件:表头是datetime、variable、value三列,但实际数据行却包含日期、时间、变量名、数值四列。用readr::read_table读取时,因为表头列数和数据列数不一致直接报错。目前我通过skip=1跳过表头的方法能解决,但我希望不用跳过表头,直接让read_table识别指定的三个表头,同时把数据里的前两列(日期+时间)合并成datetime列,试了col_types参数没成功,求可行方案。
示例数据
ex_txt="datetime variable value 2011-01-01 01:00:00 precipitation 10.0 2011-01-01 02:00:00 precipitation 5.0 2011-01-01 03:00:00 precipitation 0.0"
当前临时解决代码
read_table(ex_txt,skip=1,col_names = c("date","time","variable","value")) %>% mutate(datetime=lubridate::ydm_hms(paste(date,time))) %>% select(datetime,variable,value)
可行解决方案
由于表头行(3列)和数据行(4列)的列数不匹配,直接调用read_table会触发报错,这里提供两种更贴合需求的处理方式:
方式一:拆分表头与数据读取(清晰直观)
先单独提取原表头作为最终列名,再读取数据并合并日期时间列,最后对应原表头的结构:
library(readr) library(lubridate) library(dplyr) # 提取原表头 original_header <- read_table(ex_txt, n_max = 0) %>% colnames() # 读取数据并处理 final_df <- read_table(ex_txt, skip = 1, col_names = c("date", "time", original_header[-1])) %>% mutate(datetime = ymd_hms(paste(date, time))) %>% select(all_of(original_header))
方式二:用read_lines预处理(一步式)
通过read_lines先拆分表头和数据内容,再读取数据并合并列,最后还原原表头:
library(readr) library(lubridate) library(dplyr) lines <- read_lines(ex_txt) # 读取数据行并合并日期时间 final_df <- read_table(text = paste(lines[-1], collapse = "\n"), col_names = c("date", "time", "variable", "value")) %>% mutate(datetime = ymd_hms(paste(date, time))) %>% select(datetime, variable, value) # 还原原表头 colnames(final_df) <- str_split(lines[1], "\\s+")[[1]]
这两种方式都不需要舍弃原表头,同时完成了日期时间列的合并,完美匹配需求。
内容的提问来源于stack exchange,提问作者stuttungr
相关产品推荐
相关产品推荐

