如何拆分-应用-组合 R 中的多个变量/列
Posted
技术标签:
【中文标题】如何拆分-应用-组合 R 中的多个变量/列【英文标题】:How to Split-Apply-Combine for several variables / columns in R 【发布时间】:2015-07-15 19:48:28 【问题描述】:我想按组对多个变量执行一个函数。
假数据;
df<-data.frame(rnorm(100,mean=10),
rnorm(100,mean=15),
rnorm(100,mean=20),
rep(letters[1:10],each=10)
)
colnames(df)<-c("var1","var2","var3","group1")
在这种特殊情况下,我想按组对每个变量进行平均中心化。我想返回一个带有原始变量和居中变量的数据框。
通常我为此使用 PLYR 包;
library(plyr)
ddply(df, "group1", transform, centered_var1= scale(var1, scale=FALSE))
但是,我无法成功循环这个函数,或者想出另一种最少代码的方法来做到这一点。
我对非 PLYR 解决方案持开放态度...我的主要标准是尽量减少代码。
【问题讨论】:
【参考方案1】:colwise
函数可能正是您想要的。
library("plyr")
ddply(df, .(group1), colwise(scale, scale = FALSE))
【讨论】:
我正在分裂头发,但这个答案似乎最接近我原来的问题,返回一个数据框对象,虽然仍然需要cbind()
来组合新旧变量。在使用这种方法之前,还需要对我的完整数据框进行子集化。任何人都知道如何仅将要执行函数的变量(最好作为字符向量)提供给 ddply 以避免必须进行子集化?
在我上面的评论中回答问题;可以使用colwise
的参数.cols=
从完整数据帧中提供函数特定变量。例如,.cols=c("var1","var2")
【参考方案2】:
使用dplyr
library(dplyr)
df %>% group_by(group1) %>%
mutate_each(funs(scale(., scale=F))) -> res
【讨论】:
这导致 Windows 7 上的 R 3.1.3 崩溃。我对 dplyr 不太熟悉,所以我无法找到问题所在。任何的想法? .....................................................错误 withCallingHandlers(tryCatch(evalq(scale(c(9.15179348355958, : object '.rcpp_warning_recorder' not found 此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。 @DaveM 哦,也许重新安装 Rcpp 并升级到 R 3.2,见 ***.com/questions/28966800/… 谢谢。这解决了问题。【参考方案3】:这是你想要的吗?
ddply(df, "group1", transform, centered_var1= scale(var1, scale=FALSE),
centered_var2 = scale(var2, scale=FALSE),
centered_var3 = scale(var3, scale=FALSE))
【讨论】:
谢谢。我没有意识到我可以继续为这样的其他变量添加参数。有没有办法自动化这个,我不需要手动输入每个变量(即,像在 for 循环中索引?)以上是关于如何拆分-应用-组合 R 中的多个变量/列的主要内容,如果未能解决你的问题,请参考以下文章