作者celestialgod (攸藍)
看板R_Language
標題Re: [問題] 有關於資料整理(向右對齊)
時間Mon Jul 13 01:38:50 2015
※ 引述《gn01349943 (flying)》之銘言:
: 但我題目可能說的不夠清楚,實際情況是有值項結束不是固定的,
: 這樣就可能就需要再加個判斷有多少數量在each row,
: 例如,資料可能長這樣子,
: (dd <- data.table(x=1:6,b=c(2,'',4,5,6,7),c(1,'','',4,5,6),c(1,'','',4,5,'')
,c
: x b V3 V4 V5
: 1: 1 2 1 1
: 2: 2
: 3: 3 4
: 4: 4 5 4 4 4
: 5: 5 6 5 5 5
: 6: 6 7 6
: 想要變成這樣的格式,
: x b V3 V4 V5
: 1 1 2 1 1
: 2 2
: 3 3 4
: 4 4 5 4 4 4
: 5 5 6 5 5 5
: 6 6 7 6
這個除了直轉橫做外,提供一個用regular expression的作法
當作csv檔案,做一個平移的動作即可
好讀版程式:
http://pastebin.com/xh3qt4Xa
library(data.table)
library(dplyr)
library(magrittr)
(dt <- data.table(x=1:6,b=c(2,'',4,5,6,7),c(1,'','',4,5,6),c(1,'','',4,5,''),
c('','','',4,5,'')))
old_names = names(dt)
dt %<>% setnames(paste0("V", 1:ncol(dt)))
txt = dt %>% mutate_(Vcobime = paste0("paste(", paste0("V", 1:ncol(dt),
collapse = ","), ", sep = \",\")")) %>% .$Vcobime
loc = which(substr(txt, sapply(txt, nchar), sapply(txt, nchar)) == ",")
txt[loc] = gsub("(([^,]+,)*)(,*)", "\\3\\1", txt[loc]) %>%
substr(1, sapply(.,nchar)-1) %>% paste0(",", .)
dt = fread(paste(txt, collapse = "\n")) %>% setnames(old_names)
順便補一個用20萬列、100行的資料測試結果:
set.seed(100)
n_cols = 100
n_rows = 2e5
rightShift = sample(0:39, n_rows, TRUE)
m = matrix(rbinom(n_cols*n_rows, 10, 0.5), n_rows)
dt = t(sapply(1:n_rows, function(i){
c(as.character(m[i,1:(n_cols-rightShift[i])]), rep('', rightShift[i]))
})) %>% data.table
用regular expression 大概花
8秒 (
amazing!!!)
用直轉橫再用.SD做平移大概花
220秒
測試機器:RRO-3.2.0, windows 7 64bit,
[email protected], 16G ram
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.9.106
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1436722733.A.E8B.html
※ 編輯: celestialgod (1.163.9.106), 07/13/2015 02:19:51
推 gn01349943: 感謝分享!原來還有這種寫法,沒想到原來 regular exp07/13 09:55
→ gn01349943: ression 在 R 可以這樣用07/13 09:55
推 gn01349943: 照這個邏輯,應該所有data.table的資料格式調整,都可07/13 09:58
→ gn01349943: 以用這個方法來做,可以加快好多!07/13 09:58
這個方法剛好不久前(前一篇分享)用到data.table轉csv file的方式, 才想到要做平移
只要調整", "的位置就好。
※ 編輯: celestialgod (42.73.72.46), 07/13/2015 11:27:30