我有一个如下数据框。
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
任何简单的解决方案?感谢。
答案 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