如何拆分-应用-组合 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 中的多个变量/列的主要内容,如果未能解决你的问题,请参考以下文章

如何将列中的所有数据移动到单个列(不合并),然后拆分为R中的新列?

如何链接多个组合框表中的两个组合框?

将一列中的字符串拆分为表维护 ID 的多个分隔符

熊猫:将列中的列表拆分为多行[重复]

r - 将一个 csv 文件拆分为多个 txt 文件

根据列中的一组参数将数据框拆分为多个数据框