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