作者celestialgod (天)
看板R_Language
标题Re: [问题] 处理资料 效能询问
时间Mon Jul 4 23:27:19 2016
※ 引述《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都要是不同组合就是...
如果你能更完整陈述问题,我就能再看要怎麽写~~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.232.185.160
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1467646043.A.971.html
※ 编辑: celestialgod (36.232.185.160), 07/04/2016 23:32:56
1F:推 spiderway: 谢谢C大!我用了一下是正确的,但是说那些程式码我都没 07/05 22:41
2F:→ spiderway: 用过XD 真的要好好找时间研究一下了,原来用apply差那 07/05 22:42
3F:→ spiderway: 麽多...这好快就跑好了,我现在在跑do.call(rbind,csv) 07/05 22:42
4F:→ spiderway: 跑好几个小时了还没好,这样正常吗QQ我没很会用这些fun 07/05 22:43
5F:→ celestialgod: do.call通常不会慢,资料量过大,可能是记忆体爆掉 07/06 00:27
6F:→ celestialgod: 看看记忆体使用量 07/06 00:27
7F:推 spiderway: c大 想问一下 do.call有办法看用到第几笔了吗 跑半天了 07/07 01:38
8F:→ spiderway: 记忆体使用率40% 以前几乎没用过do.call 不太熟 07/07 01:39
9F:→ spiderway: XD跑好了 但是我不太会用大大的这个包 data的list 07/07 12:54
10F:→ spiderway: 要怎转变成像一般的data.frame那样 我直接存csv不给存 07/07 12:55
11F:推 spiderway: 拜托求救了~~~只差这步 有哪里可以看这些文件的吗 谢谢 07/07 20:07
do.call看不到用到第几笔,他是一次做binding
你有三个,他就直接rbind(a, b, c)
他不是一次一组,不过记忆体没爆的情况下,做法应该就没差了
该等还是要等(摊手,改用bind_rows看看会不会有差
这里直接存csv当然会有问题,因为最後一栏不是长度为一的向量
这里就是看你最後一栏要怎麽储存了,所以可能麻烦你回一篇文章
看後续要怎麽做了,我晚一点再测试看看10万个
※ 编辑: celestialgod (111.246.27.218), 07/07/2016 21:11:27
12F:推 spiderway: 好的 我回一篇讲清楚一点我要的 谢谢 麻烦你们了! 07/07 21:35