Re: [問題] 處理資料 效能詢問

作者: celestialgod (天)   2016-07-04 23:27:19
※ 引述《spiderway (spiderway)》之銘言:
: - 問題: 當你想要問問題時,請使用這個類別
: [問題類型]:
: 效能諮詢(我想讓R 跑更快)
: [軟體熟悉度]:
: 入門(寫過其他程式,只是對語法不熟悉)
: [問題敘述]:
: 大家好,
: 最近因為需要要處理一些資料,雖然有寫出要的東西,但是實在是跑太慢了,感覺要跑個
: 幾年= =,一定是我寫法不好,想來這問一下各位大大該怎個改才對,並學習一下
: 麻煩各位大大給予小魯指導,感激不盡!!!
: 程式:
: 讀取了全部CSV(10萬多個)存在一個大大的list裡面,要做的大概是把每一個list裡面的
: 資料都做同一件事,就是每5筆整理成1筆,然後append在一起,如下
: 1 2 3 4 5 6 1 2 3 ....
: 1 6/1 a b 12 1 2 1 6/1 a b 12 1 2 13 1 3 14 1 4 15 1 5 16 1 6
: 2 6/1 a b 13 1 3
: 3 6/1 a b 14 1 4 變成1筆>>>
: 4 6/1 a b 15 1 5
: 5 6/1 a b 16 1 6
: [程式範例]:
: http://pastie.org/10898589
: [版本]
: R version 3.3.0 (2016-05-03)
: Platform: x86_64-pc-linux-gnu (64-bit)
: Running under: Ubuntu 14.04.4 LTS
: [關鍵字]:
覺得哪裏怪怪,我先附上我目前弄出來的結果
library(pipeR)
library(plyr)
library(dplyr)
library(tidyr)
# data generation (csv_files就是你的ldf)
num_csv <- 1e1
num_xlvls <- 2
num_ylvls <- 2
sampleSize_csv <- 1e2
csv_files <- lapply(1:num_csv, function(i){
expand.grid(letters[1:num_xlvls], letters[1:num_ylvls],
stringsAsFactors = FALSE) %>>%
`[`(sample(1:nrow(.), sampleSize_csv, TRUE), ) %>>%
modifyList(setNames(lapply(1:3, function(j){
sample(1:100, sampleSize_csv, TRUE)
}), paste0("Var", 3:5))) %>>% tbl_df
})
# append一起
csv_files_append <- lapply(csv_files, function(subdf){
nest(subdf, -Var1, -Var2) %>>%
mutate(data = lapply(data, function(x){
as.matrix(x) %>>% t %>>% as.vector
}))
})
csv_files大概會像這樣:
[[1]]
Source: local data frame [100 x 5]
Var1 Var2 Var3 Var4 Var5
<chr> <chr> <int> <int> <int>
1 b a 62 29 94
2 a a 11 26 6
3 a a 49 83 32
4 b b 45 22 44
5 a b 83 57 3
6 b a 31 68 5
7 a a 24 79 71
8 a a 2 70 61
9 a a 93 22 93
10 a b 21 52 2
.. ... ... ... ... ...
然會有這樣的data.frame num_csv個
csv_files_append會長這樣:
[[1]]
Source: local data frame [4 x 3]
Var1 Var2 data
<chr> <chr> <list>
1 b a <int [84]>
2 a a <int [66]>
3 b b <int [81]>
4 a b <int [69]>
一樣會有num_csv個
但是問題是你現在要怎麼把這num_csv個csv合併再一起
還是我誤會你的意思,你一個csv只會有一個Var1跟一個Var2嗎?
如果只有一個,那每一個csv_files_append就會大概長像這樣:
[[1]]
Source: local data frame [4 x 3]
Var1 Var2 data
<chr> <chr> <list>
1 b a <int [84]>
那最後在do.call加上rbind就會像上面多個level那樣...
只是每一個csv_files的Var1跟Var2都要是不同組合就是...
如果你能更完整陳述問題,我就能再看要怎麼寫~~
作者: spiderway (spiderway)   2016-07-05 22:41:00
謝謝C大!我用了一下是正確的,但是說那些程式碼我都沒用過XD 真的要好好找時間研究一下了,原來用apply差那麼多...這好快就跑好了,我現在在跑do.call(rbind,csv)跑好幾個小時了還沒好,這樣正常嗎QQ我沒很會用這些fun
作者: celestialgod (天)   2016-07-06 00:27:00
do.call通常不會慢,資料量過大,可能是記憶體爆掉看看記憶體使用量
作者: spiderway (spiderway)   2016-07-07 01:38:00
c大 想問一下 do.call有辦法看用到第幾筆了嗎 跑半天了記憶體使用率40% 以前幾乎沒用過do.call 不太熟

Links booklink

Contact Us: admin [ a t ] ucptt.com