作者celestialgod (天)
看板R_Language
标题Re: [问题] .txt的资料汇入及行列转换
时间Wed Sep 2 17:50:06 2015
※ 引述《milkdad (milkdad)》之铭言:
: [问题叙述]:
: 想汇入一个约100mb的.txt档
: 此档案的“列”只有12笔 但“行”有约92万笔
: 因此想要做行列转换 以利後续分析
: 但天真如我却发现连汇入资料都成问题
:
: [程式范例]:
:
: 我是想直接用read.table的方式汇入 再用 t()来转置 如下
: datfile=paste(路径, '档案.txt', sep='')
: data=read.table(datfile, header=TRUE,sep='\t')
: 但到了这一步 R就一直转了两个小时 因此还没试到行列转换
: 才想上来询问 麻烦各位大大帮忙
你要做转置,假设你全部都是数值
我生成资料,试试看各种读取器的效能...
先说结论,因为读进来的型态是data.frame
所以R必须要确定每行每列个数相等
而且同一行要一样型态
我觉得在这上面会花上一些时间
但是测试起来其实没差很多
反而是读入字串再转换成相对的型态花了很长时间
因此,如果是这种案例,我建议用暴力法去做,快而简单
因为暴力法做的话,checking部分就都没有跑
你只需要确定自己input的档案是regular就好
程式如下: (关於fread, magrittr请参考我的文章:资料整理套件介绍)
library(data.table)
library(readr)
library(stringr)
library(magrittr)
set.seed(200)
datOriginal = round(matrix(rnorm(5e5*12), 12), 4)
inputStr = str_c(apply(datOriginal, 1, str_c, collapse = ','),
collapse = '\n')
datOriginal = t(datOriginal)
## the fastest way
st = proc.time()
tmp = readLines(textConnection(inputStr))
dat = do.call(cbind, strsplit(tmp, ',')) %>% {matrix(as.numeric(.), nrow(.))}
proc.time() - st
# user system elapsed
# 18.11 0.09 18.36
all.equal(dat, datOriginal) # TRUE
st = proc.time()
dat = t(as.matrix(fread(inputStr)))
proc.time() - st
# user system elapsed
# 40.92 0.10 41.41
all.equal(dat, datOriginal, check.attributes = FALSE) # TRUE
st = proc.time()
dat = read_csv(inputStr)
proc.time() - st
# 半小时跑不出来
all.equal(t(as.matrix(dat)), datOriginal)
st = proc.time()
dat = read.csv(inputStr)
proc.time() - st
# 半小时跑不出来
all.equal(t(as.matrix(dat)), datOriginal)
st = proc.time()
numCols = readLines(textConnection(inputStr), n = 1) %>%
{nchar(.) - nchar(gsub(',', '', .)) + 1}
dat = fread(inputStr, colClasses = rep('character', numCols)) %>%
{matrix(as.numeric(as.matrix(.)), ncol(.), byrow = TRUE)}
proc.time() - st
# user system elapsed
# 39.30 0.08 39.67
all.equal(dat, datOriginal) # TRUE
st = proc.time()
numCols = readLines(textConnection(inputStr), n = 1) %>%
{nchar(.) - nchar(gsub(',', '', .)) + 1}
dat = read_csv(inputStr, col_types =
replicate(numCols,col_character(),simplify=FALSE)) %>%
{matrix(as.numeric(as.matrix(.)), ncol(.), byrow = TRUE)}
proc.time() - st
# 一样半小时没出来...
all.equal(dat, datOriginal)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.160.170.238
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1441187409.A.8EF.html
※ 编辑: celestialgod (1.160.170.238), 09/02/2015 17:51:38
1F:推 milkdad: 感谢版主热心尝试 呜呜 已解决 大感谢 09/02 21:07