如何在R中读取带注释的制表符分隔数据为tibble或data.frame
R读取带注释、表头和类型说明行的制表符分隔数据方法
你提供的是USGS水文数据的典型格式,可通过以下两种方法读取为tibble或data.frame:
方法1:使用tidyverse套件(推荐,输出为tibble)
操作步骤
- 加载依赖包
library(tidyverse)
- 读取并清洗数据
# 读取文件所有行,自动跳过#开头的注释行 raw_lines <- read_lines("你的数据文件路径.txt", comment = "#") # 提取统一表头(取第一个非注释行即可,该类数据所有块表头一致) col_names <- str_split_1(raw_lines[1], "\\t") # 过滤掉所有重复表头行和类型说明行 data_lines <- raw_lines[!str_detect(raw_lines, "^agency_cd|\\d+s.*\\d+n.*\\d+d")] # 读取数据为tibble,指定列类型避免自动识别错误 df <- read_tsv( I(data_lines), col_names = col_names, col_types = "ccDnc" # 对应5列的类型:字符、字符、日期、数值、字符 )
方法2:基础R实现(输出为data.frame)
# 读取所有行,过滤#开头的注释 all_lines <- readLines("你的数据文件路径.txt") valid_lines <- all_lines[!startsWith(all_lines, "#")] # 提取表头 col_names <- strsplit(valid_lines[1], "\t")[[1]] # 过滤重复表头和类型说明行 data_lines <- valid_lines[!grepl("^agency_cd|\\d+s.*\\d+n.*\\d+d", valid_lines)] # 读取为data.frame df <- read.delim( text = data_lines, sep = "\t", header = FALSE, col.names = col_names, colClasses = c("character", "character", "Date", "numeric", "character"), na.strings = "" )
注意事项
- 站点号
site_no指定为字符类型,避免前导0丢失 - 空值会自动识别为
NA,匹配样例中缺测日期的数值为空的情况 - 如果数据块表头不统一,可添加分段逻辑分别处理每个数据块的表头和数据
内容的提问来源于stack exchange,提问作者hrkshr
相关产品推荐
相关产品推荐

