已加载文本行到内存,如何无需fread()直接转换为数据框?
直接把lines_new转成数据框的实操方法
你已经把处理好的行存在lines_new里了,完全不用再调用fread,直接拆分转换就行,分两步走:
第一步:先把列名抠出来
首先找到那行#@开头的列名行,去掉前缀拆分就行:
# 定位#@开头的列名行 colname_line <- lines_new[grepl("^#@", lines_new)] # 去掉#@前缀,按你文件的实际分隔符拆分(这里假设是制表符,可换成","或"\\s+") col_names <- strsplit(sub("^#@", "", colname_line), "\t")[[1]]
第二步:把数据行转成数据框
先过滤掉所有带#的注释行,剩下的就是纯数据行,然后选合适的方法转换:
方法一:用基础包的read.table(简单直接)
# 筛掉所有注释行 data_lines <- lines_new[!grepl("^#", lines_new)] # 直接用text参数读入内存里的行 df <- read.table(text = data_lines, sep = "\t", col.names = col_names, stringsAsFactors = FALSE)
方法二:用data.table的rbindlist(200万行更高效)
如果是200万行这种大数据量,用data.table的方法速度更快:
library(data.table) # 先筛出数据行 data_lines <- lines_new[!grepl("^#", lines_new)] # 把每一行拆成列表,再合并成data.table data_list <- lapply(data_lines, function(x) strsplit(x, "\t")[[1]]) dt <- rbindlist(lapply(data_list, as.list)) # 给列名赋值 setnames(dt, col_names)
注意点
- 分隔符要对应你的文件:如果是多个空格分隔,strsplit里用
"\\s+",read.table里sep设为""即可自动识别。 - 如果数据里有带引号的字段,记得给read.table加
quote = "\""这类参数,避免拆分出错。
内容的提问来源于stack exchange,提问作者ACE
相关产品推荐
相关产品推荐

