【问题标题】:sapply for each group using dplyr使用 dplyr 为每个组申请
【发布时间】:2019-03-02 21:35:55
【问题描述】:
df <- data.frame(group = rep(1:4, each = 10), 
                   x1 = rnorm(40),  x2 = rnorm(40), x3 = rnorm(40), x4 = rnorm(40), 
                   X5 = rnorm(40), x6 = rnorm(40), x7 = rnorm(40))

sapply(df[, 4:ncol(df)], function(x) sd(x)/mean(x))

我想为每个组应用此功能。如何更正以下命令?

df %>% dplyr::group_by(group) %>% do.call(sapply(.[, 4:ncol(.)] function(x) sd(x)/mean(x)))

【问题讨论】:

  • 您预期的输出数据是多少?每组一行和 4:ncol() 矩阵范围的 sd(x)/mean(x) 的值?换句话说,一个 4x2 的组数据框和 sd/mean 结果?
  • 没有。我需要一个 4 X 5 的数据框。每一行是一个组,每一列是x3、x4、x5、x6和x7列的CV。

标签: r dplyr sapply


【解决方案1】:

如果我理解您的问题/目标,以下将给出您正在寻找的结果。它使用 plyr 包而不是 dplyr 包。您可能会在使用 %>% 函数和 do.call 时遇到问题,因为 %>% 只是将前面的对象作为第一个参数传递给后续函数的快捷方式,并且 do.call 需要一个命名函数作为它的第一个参数

library(plyr)

df <- data.frame(group = rep(1:4, each = 10), 
                 x1 = rnorm(40),  x2 = rnorm(40), x3 = rnorm(40), x4 = rnorm(40), 
                 X5 = rnorm(40), x6 = rnorm(40), x7 = rnorm(40))

ddply(df,.(group),function(x) 
  { 
    sapply(x[,4:ncol(x)],function(y) sd(y)/mean(y))
  })

给出以下结果

 group        x3        x4        X5         x6        x7
1     1  1.650401 -1.591829  1.509770   6.464991  3.520367
2     2 11.491301 -2.326737 -1.725810 -11.712510  2.293093
3     3 -3.623159 -1.416755  2.958689   1.629667 -4.318230
4     4  9.169641 -4.219095  2.083300   1.985500 -1.678107

【讨论】:

    【解决方案2】:

    考虑基本 R 的 bytapply 的面向对象包装器):

    数据 (为可重复而播种)

    set.seed(3219)
    df <- data.frame(group = rep(1:4, each = 10), 
                       x1 = rnorm(40),  x2 = rnorm(40), x3 = rnorm(40), x4 = rnorm(40), 
                       X5 = rnorm(40), x6 = rnorm(40), x7 = rnorm(40))
    

    by

    by_list <- by(df, df$group, function(sub) 
        sapply(sub[, 4:ncol(sub)], function(x) sd(x)/mean(x))
    )
    
    # LIST
    by_list 
    # df$group: 1
    #        x3        x4        X5        x6        x7 
    # -1.077354  2.252270 -2.256086 -1.716327 -5.273771 
    # ------------------------------------------------------------ 
    # df$group: 2
    #         x3         x4         X5         x6         x7 
    #   2.580065   5.054094 -10.985927  32.716116   6.732901 
    # ------------------------------------------------------------ 
    # df$group: 3
    #         x3         x4         X5         x6         x7 
    #  -3.523565  -1.670539  -5.042595  -7.787303 -15.486737 
    # ------------------------------------------------------------ 
    # df$group: 4
    #        x3        x4        X5        x6        x7 
    # -5.597470 -9.842997  1.985010 33.657188  2.629724 
    
    # MATRIX
    do.call(rbind, by_list)
    
    #          x3        x4         X5        x6         x7
    # 1 -1.077354  2.252270  -2.256086 -1.716327  -5.273771
    # 2  2.580065  5.054094 -10.985927 32.716116   6.732901
    # 3 -3.523565 -1.670539  -5.042595 -7.787303 -15.486737
    # 4 -5.597470 -9.842997   1.985010 33.657188   2.629724
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 2023-03-28
      相关资源
      最近更新 更多