R_Language 板


LINE

※ 引述《spiderway (spiderway)》之铭言: : ※ 引述《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 : : [关键字]: : 解说一下我的资料型态 : CSV档10万个,每一个大概有2000~3000多列不等,但一定是5个倍数 : 但是他的资料都是5列一组,所以我才会希望第一篇说得让他5个整理成一列 : 前面会有V1~V3分别是 时间和AB两个属性,前五笔都是一样的,V4~V6是我要处理的。 : 我上次是选C板大的教学使用,但是因为之前都不常用过dply那些,不太会用 : 用到csv_append之後是没问题,但是在data那边是个list我想要的是一个值 : 一行,所以最後的资料希望是像这样,最後存成一个csv,因为我之後还要在处理一个类 : 似的资料,只有後面不一样,再合并在一起。 : V1 V2 V3 V4 ... V18 : 时间1 A1 B1 (整理的那5 rows合并的)1 : 时间2 A2 B2 (整理的那5 rows合并的)2 : . : . : . : 我现在面临的问题, : 1,do.call(rbind,csv_append)大概下午跑到隔天早上,但至少跑好了XD : 2,data那边是list我不太理解是不是能够直接转 : 2,我後来有想到办法,我发现我都只会这种处理方法... : http://pastie.org/10901154 : 是可以把每一个都转成我要的之後在做do.call rbind : 在请大大帮忙了 谢谢~~~~~~ : 心得:谢谢各位大大的帮忙,虽然我很多function都看不太懂= = : 而且发现好像apply系列很好用欸,之前都一直觉得用for就好了,真的遇到资料量变大差 : 别真多...,之後应该好好找时间重读一下apply系列和dply那些 我就用三千笔测试就好,下面是三种不同方法: 好读版:http://pastebin.com/GPgR4FSc library(pipeR) library(plyr) library(dplyr) library(tidyr) # data generation (csv_files就是你的ldf) num_csv <- 3e3 num_xlvls <- 30 num_ylvls <- 30 timePoints <- expand.grid(paste0("a", 1:num_xlvls), paste0("b", 1:num_ylvls), stringsAsFactors = FALSE) csv_files <- lapply(1:num_csv, function(i){ dat <- sample(1:nrow(timePoints), sample(400:600, 1)) %>>% rep(each = 5) %>>% (timePoints[., ]) %>>% modifyList(setNames(lapply(1:3, function(j){ sample(1:100, nrow(.), TRUE) }), paste0("Var", 3:5))) %>>% tbl_df }) # 整并 + 分开 st <- proc.time() outRes1 <- lapply(csv_files, function(subdf){ nest(subdf, -Var1, -Var2) %>>% mutate(data = lapply(data, function(x){ as.matrix(x) %>>% t %>>% as.vector %>>% paste(collapse = ";") })) %>>% unnest(data) %>>% separate(data, paste0("V", 1:15)) %>>% mutate_each(funs(as.integer(.)), -Var1, -Var2) }) %>>% bind_rows proc.time() - st # user system elapsed # 263.93 0.02 265.86 st <- proc.time() outRes2 <- lapply(csv_files, function(subdf){ subdf %>>% gather(vars, values, -Var1, -Var2) %>>% group_by(Var1, Var2) %>>% summarise(tmp = paste(values, collapse = ";")) %>>% ungroup %>>% separate(tmp, paste0("V", 1:15)) %>>% mutate_each(funs(as.integer(.)), -Var1, -Var2) }) %>>% bind_rows proc.time() - st # user system elapsed # 70.01 0.00 70.25 library(data.table) st <- proc.time() outRes3 <- lapply(csv_files, function(subdf){ subdf %>>% data.table %>>% melt(c("Var1", "Var2")) %>>% `[`( , list(tmp = paste(value, collapse = ";")), by = c("Var1", "Var2"))%>>% `[`( , `:=`(paste0("V", 1:15), tstrsplit(tmp, ";"))) %>>% `[`( , tmp := NULL) %>>% `[`( , `:=`(paste0("V", 1:15), lapply(.SD, as.integer)), .SDcols = V1:V15) }) %>>% rbindlist proc.time() - st # user system elapsed # 37.35 1.30 38.16 第一个方法只是把我原本方法做一个修正,但是nest跟unnest实在太花时间 而且没有必要,所以就有了第二个版本直接把资料直接做合并的动作 虽然快了四倍,但是速度还可以更快,所以就有了第三个版本 (测了一下记忆体使用量已经很低) 我最近开始往回走,虽然dplyr好用,但是data.table在处理资料还是有他的优势 在第三个方法可以看到,硬是比dplyr的解法快了一倍,但是相对写起来就没那麽漂亮 这个是code style跟效能的取舍(摊手 另外,我一万个csv就会出问题了... 记忆体真没那麽大... 如果你记忆体真的有很大在考虑这样做,没那麽大可以考虑分段读取 分段写入时,在append就好,不过之後读进来又很麻烦(摊手 以上,敬请参考~~~ OS: 难得的台风假阿~~~ 大家请注意自身安全!! 7/8 11:00补上data.table把V1~V15转成integer -- R资料整理套件系列文: magrittr #1LhSWhpH (R_Language) http://tinyurl.com/j3ql84c data.table #1LhW7Tvj (R_Language) http://tinyurl.com/hr77hrn dplyr(上) #1LhpJCfB (R_Language) http://tinyurl.com/jtg4hau dplyr(下) #1Lhw8b-s (R_Language) tidyr #1Liqls1R (R_Language) http://tinyurl.com/jq3o2g3 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.246.27.218
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1467942261.A.CE9.html ※ 编辑: celestialgod (111.246.27.218), 07/08/2016 11:11:34







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP