Re: [問題] .txt的資料匯入及行列轉換
※ 引述《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://www.ptt.cc/bbs/R_Language/M.1441187409.A.8EF.html
※ 編輯: celestialgod (1.160.170.238), 09/02/2015 17:51:38
推
09/02 21:07, , 1F
09/02 21:07, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):