R_Language 板


LINE

各位大大晚安, 我有一份总共九个栏位约30万笔的原始资料, 因为想要分成4组画图 所以第一个想到的事就是新增第十个栏位(称作group), 然後根据某个栏位(假设为第八个栏位好了)的值分组, 并填入第十个栏位(group1~group4) 很笨的用for loop搭配if else写,可是速度整个悲剧... 好读程式码请见: http://pastie.org/10200854 add.col.group <- function(data){ data$group <- 0 for(i in 1:nrow(data)){ if(data[i,8] < 0.25){data[i,10] <- "group1"} else if(data[i,8] < 0.5 & data[i,8] > 0.25){data[i,10] <- "group2" } else if(data[i,8] < 0.75 & data[i,8] > 0.5){data[i,10] <- "group3" } else {data[i,10] <- "group4" } } data } ## call function new.data <- add.col.group(data) 後来尝试改成用sapply搭配自己写的判断函式 好读程式码请见: http://pastie.org/10200933 ## 判断分组 assign.group <- function(value){ if(value < 0.25){return_value <- "group1"} else if(value < 0.5){return_value <- "group2" } else if(value < 0.75){return_value <- "group3" } else return_value <- "group4" return_value } ## 新增栏位并填入值 add.col.group <- function(data){ data$group <- 0 data$group <- sapply(data$avg, assign_group) ##avg即为第八个栏位的名称 data } ## call function new_data <- add.col.group(data) 结果没想到,速度竟然是爆发性的进展!!!(惊) (因为怕爆掉,先用2万笔资料测试) 用for loop写: user system elapsed 0.11 0.00 0.11 用sapply写: user system elapsed 42.18 0.00 43.02 可是不知道这样的写法会不会很笨...还有更好的写法吗? 还是其实根本不应该用*apply写? 还请各位高手大大指点一下,谢谢大家了! 後记: 原本是想要发文求指点sapply的写法... 结果刚刚文章打到一半当掉的时候, 突然灵光乍现了! 虽然好像没有很难, 可是能靠自己的力量想出来总是很开心的一件事啊>"< (尽管文章要重打很累XD) [环境叙述]: version.string R version 3.0.3 (2014-03-06) [关键字]: for loop, sapply --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.115.22.250
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1432236554.A.019.html
1F:→ obarisk: apply和for差不多吧,vectorize才会变快 05/22 09:06
2F:→ obarisk: 用cut+cbind 05/22 09:34
3F:→ obarisk: 或是用 nvec <- c(NA, length=nrow(da)) 05/22 09:34
4F:→ obarisk: nvec[da[, 8]<.25] <- "grp1" 05/22 09:35
5F:→ obarisk: 依此类推,最後再cbind 05/22 09:35
6F:推 gsuper: Function内包function是主因 05/22 13:57
7F:→ gsuper: 这种写法很不容易写 效率又会爆炸性的变差 真的是事倍功半 05/22 13:58
8F:→ gsuper: 另外一个大问题 05/22 14:30
9F:→ gsuper: 我直接开一篇好了 05/22 14:31
10F:→ andrew43: 二个关键:用 cut(),以及不要多次改写 data frame。 05/22 22:33
11F:→ andrew43: 用对方法的话,20万笔应该按enter就马上有结果不会卡。 05/22 22:36
12F:→ locka: 在此先谢谢obarisk,gsuper,andrew43等大大热情的回应。我 05/23 00:25
13F:→ locka: 觉得andrew大讲到一个点,就是我一直想要改写data frame, 05/23 00:25
14F:→ locka: 因为对我来说总觉得这样资料比较好懂不会乱(似乎脑袋好像 05/23 00:25
15F:→ locka: 还停留在用一般dbms的table在理解r的data frame…)待我测 05/23 00:25
16F:→ locka: 试後有心得再跟大家分享,先谢谢大家了! 05/23 00:25
17F:→ andrew43: 我的「改写」的意思是不要频繁地改变data frame 05/23 01:08
18F:→ andrew43: 因为这会算很慢,并不是指不要改变data frame喔 05/23 01:09
19F:推 alasa15: 看起来dplyr可以完美解决你的问题 05/24 02:48







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灯, 水草

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

TOP