R聚合而不进行汇总

时间:2016-07-20 21:05:58

标签: r

我有一个如下数据框。

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

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

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

任何简单的解决方案?感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

我们可以使用mutate_each

中的dplyr
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

答案 2 :(得分:1)

使用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