Re: [問題] .txt的資料匯入及行列轉換

看板R_Language作者 (天)時間8年前 (2015/09/02 17:50), 8年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1LviPHZl (R_Language)
文章代碼(AID): #1LviPHZl (R_Language)