【问题标题】:R Aggregate without summarisingR聚合而不汇总
【发布时间】:2016-07-20 21:05:58
【问题描述】:

我有一个如下所示的数据框。

dat <- data.frame(k=c("A","A","B","B","B"),a=c(2,3,1,3,4),b=c(5,8,2,1,2))
> dat
  k a b
1 A 2 5
2 A 3 8
3 B 1 2
4 B 3 1
5 B 4 2

我想在 k 上聚合 a 和 b,同时保持原始数据结构。以下两种方法总结了结果。

aggregate(.~k,data=dat,mean)
  k        a        b
1 A 2.500000 6.500000
2 B 2.666667 1.666667

plyr::ddply(dat,.(k),colwise(mean))
  k        a        b
1 A 2.500000 6.500000
2 B 2.666667 1.666667

但我正在寻找这样的结果:

  k a    b
1 A 2.50 6.50
2 A 2.50 6.50
3 B 2.66 1.66
4 B 2.66 1.66
5 B 2.66 1.66

有什么简单的解决方案吗?谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用ave():

    dat[-1] <- sapply(dat[-1],ave,dat$k)
    #> dat
    #  k        a        b
    #1 A 2.500000 6.500000
    #2 A 2.500000 6.500000
    #3 B 2.666667 1.666667
    #4 B 2.666667 1.666667
    #5 B 2.666667 1.666667
    

    【讨论】:

      【解决方案2】:

      我们可以从dplyr使用mutate_each

      library(dplyr)
      dat %>%
        group_by(k) %>% 
        mutate_each(funs(mean))
      #       k        a        b
      #  <fctr>    <dbl>    <dbl>
      #1      A 2.500000 6.500000
      #2      A 2.500000 6.500000
      #3      B 2.666667 1.666667
      #4      B 2.666667 1.666667
      #5      B 2.666667 1.666667
      

      【讨论】:

        【解决方案3】:

        使用data.table

        library(data.table)
        setDT(dat)[ , c("a", "b") := lapply(.SD, mean), by = k]
        dat
        
           k        a        b
        1: A 2.500000 6.500000
        2: A 2.500000 6.500000
        3: B 2.666667 1.666667
        4: B 2.666667 1.666667
        5: B 2.666667 1.666667
        

        【讨论】:

          猜你喜欢
          • 2014-01-24
          • 1970-01-01
          • 2019-11-04
          • 2019-03-25
          • 2020-03-07
          • 1970-01-01
          • 1970-01-01
          • 2018-09-01
          • 2015-09-28
          相关资源
          最近更新 更多