摸索R包plyr:离开R中显式轮回
当前位置:以往代写 > 其他教程 >摸索R包plyr:离开R中显式轮回
2019-06-14

摸索R包plyr:离开R中显式轮回

摸索R包plyr:离开R中显式轮回

所有R用户接管的第一个“莫名其妙”的原则就是:



不要在R中写显式轮回…


不要写显式轮回…


不要写轮回…


不轮回…


不…


我第一次接管到这个“黄金律”,就跟当年从basic语言转到C语言的时候,老师说:



不要写go to…


不go to…


不…


一样的,好震撼。往往对付R用户来说,R根基上不行能是他们进修的第一门计较机语言,什么C啊Java啊甚至matlab可能VBA都大概排在R前面。所以,轮回,无论是for照旧while,仿佛都是再屡见不鲜不外的工作了。换句话说,禁绝写轮回,我要你计较机还辛辛苦苦的码代码干啥?你丫不就是一免费较准确的反复劳动力么!


带着一种处处轮回的思维,打仗R的初期我是各类不适应不适应啊。轮回不让写???厥后习惯了去搜R的各类稀奇离奇的函数,发明根基上我想用的成果都被其他大牛们实现了,只需要知道怎么挪用那些函数和参数就可以了。这个,挺好的嘛,适合我这种懒人。但是,总有一些时刻需要写轮回的嘛…呜啊。


厥后,lijian哥给我不绝的潜移默化各类展示sapply等apply类函数的强大,越来越体会到一种思维习惯的变革——不再是轮回,而是向量操纵。这就比如以前只知道求和公式的孩子一朝进修了矩阵乘法,各类惊奇跪拜。其实,从这个角度来讲,R内里许多对象都是更但愿借助向量来做而不是本身一个一个的写轮回。嗯啊,公然思维方法是有很大晋升的。


在疾苦的跟apply类函数纠结了一阵子之后,惊奇的在stackoverflow.com上看到很多人用一个莫名其妙的ddply函数可能ldply函数来实现雷同sapply的成果,一时之间不免好奇。于是按图索骥,找到了神奇的plyr包。于是,开启了一扇门(即刻想到叶诗文拿到第二枚推荐的时候,两位央视讲解员豪情四射的即时赞同)。相映成趣啊。plyr的表明只有一句:The split-apply-combine strategy for R。嗯,超等切合其作者一贯的气势气魄…


简朴来说,这个包就是用来简化apply类函数的利用的。作者给出了一个稳健回归的例子(原文载于JSS):



已有函数:


deseasf <- function(value) rlm(value ~ month – 1)


轮回版:
models <- as.list(rep(NA, 24 * 24))
dim(models) <- c(24, 24)
deseas <- array(NA, c(24, 24, 72))
dimnames(deseas) <- dimnames(ozone)
for (i in seq_len(24)) {
for(j in seq_len(24)) {
mod <- deseasf(ozone[i, j, ])
models[[i, j]] <- mod
deseas[i, j, ] <- resid(mod)
}
}

非轮回版:
models <- apply(ozone, 1:2, deseasf)
resids_list <- lapply(models, resid)
resids <- unlist(resids_list)
dim(resids) <- c(72, 24, 24)
deseas <- aperm(resids, c(2, 3, 1))
dimnames(deseas) <- dimnames(ozone)


plyr版
models <- dlply(ozonedf, .(lat, long), deseasf_df)
deseas <- ldply(models, resid)


嗯,代码长度上可以看出来显著不同了吧,嘻嘻。根基上,plyr就是一步步的从split()到lapply()最后rbind()功效嗯。我小我私家是怎么用的呢?小小剧透一下,最近在处理惩罚一堆XML数据,固然自认对HTML很熟,可是对XML照旧各类两眼一抹黑。为了把XML转为利便的data.frame名目,网上一通乱搜最终找到了简捷的办理方案:



## xml_names中含有一系列的XML文件地点,为字符串向量。
xml_df <- ldply(xml_names,
function(x) {
as.data.frame(t(xmlToList(x)$weibo_fans))
}
)


挪用XML包的xmlToList()函数之后,就可以用ldply利便的开始揉数据了。嘻嘻,然后加一个 print()函数,就可以舒舒服服的见证屏幕上几千个XML文件被逐步刷本钱身想要的名目标进程了。爽死了。


从数据输入上来看,支持三大类——array,list和dataframe。我小我私家最偏幸dataframe,固然list有时候更利便机动。别的尚有几个利便的函数可以用,好比:



each():each(min, max)等价于function(x) c(min = min(x), max = max(x))。


colwise():colwise(median)将计较列的中位数。


arrange():超等顺手的函数,可以利便的给dataframe排序。


rename():又是一个handy的函数,按变量名而不是变量位置重定名。


count():返回unique值,等价于length(unique(**))。


match_df():利便的共同count()等,选出切合条件的行,有点像merge(…,all=F)的感受。


join():对付习惯SQL的童鞋,大概比merge()用起来更顺手吧(虽然也更快一点),不外机动性照旧比不上merge()嗯。


好吧,看出这位作者Hadley的气势气魄了吧,根基上能save your life的函数都给预备好了。此刻我的办公桌上常年挂着stringr的简短说明,然后习惯ggplot2绘图,reshape2揉数据…这算不算Hadley依赖症捏?


——Happy Hour (欢悦年华模式开启)——

正儿八经的R包先容说完了之后,开始一点欢悦的时间。常来的读者们多半知道,我最近乐成的由“对外”的consultant脚色转变为“对内”的analyst,嗯,事情的重点大纷歧样了(交换+领略 -> 领略+实现)。虽然这更多是一种小我私家选择,但愿打仗到更好玩的数据,进一步实现小我私家代价××××(空话官话连篇就不赘述了)。但是,总得让人有个吐槽的时刻嘛。附上“现实体”漫画,嘻嘻。


暴走的数据阐明师

暴走的数据阐明师 – 点击查察全图


相关代码附上:
### elements for comics ###
time_cost <- data.frame(Task = c(“1.Clarify Demand”, “2.Model Selection”, “3.Get Data”, “4.Data Cleaning”, “5.Analyzing”, “6.Report”), Time_ideal = c(0.1, 0.3, 0.1, 0.1, 0.3, 0.1), Time_real = c(0.2, 0.05, 0.2, 0.3, 0.05, 0.2))
library(ggplot2)

library(gridExtra)
library(scales)
g1 <- ggplot(data = time_cost, aes(x = Task, y = Time_ideal, fill = Time_ideal)) + geom_bar() + coord_flip() + geom_text(aes(label = paste0(round(Time_ideal * 100, 2), “%”), y = Time_ideal/2)) + scale_y_continuous(labels = percent) + scale_fill_continuous(low = “deepskyblue1”, high = “deepskyblue3”) + scale_x_discrete(limits = rev(levels(time_cost$Task)))
g2 <- ggplot(data = time_cost, aes(x = Task, y = Time_real, fill = Time_real)) + geom_bar() + coord_flip() + geom_text(aes(label = paste0(round(Time_real * 100, 2), “%”), y = Time_real/2)) + scale_y_continuous(labels = percent) + scale_fill_continuous(low = “skyblue2”, high = “chocolate3”) + scale_x_discrete(limits = rev(levels(time_cost$Task)))
grid.arrange(g1, g2, nrow = 1)

    关键字:

在线提交作业