tidyverse的read_delim()如何处理表头错位的制表符文本文件?
解决read_delim读取带无表头行名文件的问题
针对你遇到的情况,tidyverse的readr包可以通过以下几种方式处理这类第一列为无表头行名的制表符文件:
方法1:手动处理表头与行名
先提取文件的表头行,再读取数据并设置行名:
library(readr) # 读取第一行作为表头 header <- str_split(read_lines("test.txt", n_max = 1), "\t")[[1]] # 读取数据,跳过表头行,使用处理后的列名 dat <- read_tsv("test.txt", skip = 1, col_names = header[-1]) # 将第一列设为行名并移除该列 rownames(dat) <- dat[[1]] dat <- dat[, -1]
方法2:指定列类型并调整行名
直接读取时指定列类型,后续再处理行名:
library(readr) # 明确指定每列类型,第一列为行名字符型 dat <- read_delim("test.txt", delim = "\t", col_types = cols( X1 = col_character(), T1 = col_double(), T2 = col_double(), T3 = col_double() )) # 设置行名并删除原列 rownames(dat) <- dat$X1 dat <- dplyr::select(dat, -X1)
方法3:用vroom简化操作
vroom是readr生态下的高效读取工具,支持直接识别行名列:
library(vroom) # 读取时指定行名列,自动处理表头偏移 dat <- vroom("test.txt", delim = "\t", id = "row_names") # 调整行名并移除辅助列 rownames(dat) <- dat$row_names dat <- dplyr::select(dat, -row_names)
运行上述任意方法后,都能得到和read.table一致的结果:
dat T1 T2 T3 A 1 4 7 B 2 5 8 C 3 6 9
内容的提问来源于stack exchange,提问作者Xiaokuan Wei
相关产品推荐
相关产品推荐

