[讨论] for loop与*apply function请益

楼主: locka (locka)   2015-05-22 03:29:11
各位大大晚安,
我有一份总共九个字段约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
作者: obarisk (OSWALT)   2015-05-22 09:06:00
apply和for差不多吧,vectorize才会变快用cut+cbind或是用 nvec <- c(NA, length=nrow(da))nvec[da[, 8]<.25] <- "grp1"依此类推,最后再cbind
作者: gsuper (Logit(odds))   2015-05-22 13:57:00
Function内包function是主因这种写法很不容易写 效率又会爆炸性的变差 真的是事倍功半另外一个大问题我直接开一篇好了
作者: andrew43 (讨厌有好心推文后删文者)   2015-05-22 22:33:00
二个关键:用 cut(),以及不要多次改写 data frame。用对方法的话,20万笔应该按enter就马上有结果不会卡。
楼主: locka (locka)   2015-05-23 00:25:00
在此先谢谢obarisk,gsuper,andrew43等大大热情的回应。我觉得andrew大讲到一个点,就是我一直想要改写data frame,因为对我来说总觉得这样资料比较好懂不会乱(似乎脑袋好像还停留在用一般dbms的table在理解r的data frame…)待我测试后有心得再跟大家分享,先谢谢大家了!
作者: andrew43 (讨厌有好心推文后删文者)   2015-05-23 01:08:00
我的“改写”的意思是不要频繁地改变data frame因为这会算很慢,并不是指不要改变data frame喔
作者: alasa15 (alasa)   2015-05-24 02:48:00
看起来dplyr可以完美解决你的问题

Links booklink

Contact Us: admin [ a t ] ucptt.com