【问题标题】:How to Split-Apply-Combine for several variables / columns in R如何拆分-应用-组合 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 解决方案持开放态度...我的主要标准是尽量减少代码。

【问题讨论】:

    标签: r plyr split-apply-combine


    【解决方案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,见 stackoverflow.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 循环中索引?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多