列中每组的平均值,每行的结果

时间:2015-05-12 02:02:04

标签: r dataframe mean

我有这个数据框(从@Vinterwoo的代码调整),我正在寻找一个函数来获得每列的每组平均值。因此,C1和C2列中A组的平均值,B组等的A组的平均值。我知道如何获得每组的平均值(例如使用aggregate)但我需要在相应组的每一行中显示均值(请参阅所需的输出)。

C1 <- c(3,2,4,3,6,7,5)
C2 <- c(3,7,3,4,5,2,1)
DF <- data.frame(ID=c("A","C","A","C","E","F","E"),C1=C1,C2=C2)

ID C1 C2
A  3  3
C  2  7
A  4  3
C  3  4
E  6  5
F  7  2
E  5  1

期望的输出:

ID C1 C2 avg.C1 avg.C2
A  3  3    3.5    3.0
C  2  7    2.5    5.5
A  4  3    3.5    3.0
C  3  4    2.5    5.5
E  6  5    5.5    3.0
F  7  2    7.0    2.0
E  5  1    5.5    3.0

5 个答案:

答案 0 :(得分:4)

我会建议&#34; data.table&#34;包装:

sdcols <- names(DF)[-1]      ## A vector of the new columns we want to add
as.data.table(DF)[, paste(sdcols, "mean", sep = "_") := lapply(.SD, mean), 
                  by = ID][] ## you can also be more specific and specify sdcols
#    ID C1 C2 C1_mean C2_mean
# 1:  A  3  3     3.5     3.0
# 2:  C  2  7     2.5     5.5
# 3:  A  4  3     3.5     3.0
# 4:  C  3  4     2.5     5.5
# 5:  E  6  5     5.5     3.0
# 6:  F  7  2     7.0     2.0
# 7:  E  5  1     5.5     3.0

如注释代码所示,您可以使用.SDcols参数指定要执行的列:

sdcols <- names(DF)[-1]
as.data.table(DF)[, paste(sdcols, "mean", sep = "_") := lapply(.SD, mean), 
                  by = ID, .SDcols = sdcols][]

答案 1 :(得分:2)

尝试:

library(dplyr)
DF %>% group_by(ID) %>% mutate(avg.C1 = mean(C1), avg.C2 = mean(C2))

给出了:

#Source: local data frame [7 x 5]
#Groups: ID
#
#  ID C1 C2 avg.C1 avg.C2
#1  A  3  3    3.5    3.0
#2  C  2  7    2.5    5.5
#3  A  4  3    3.5    3.0
#4  C  3  4    2.5    5.5
#5  E  6  5    5.5    3.0
#6  F  7  2    7.0    2.0
#7  E  5  1    5.5    3.0

答案 2 :(得分:1)

您可以使用聚合和合并作为以下

DF2=aggregate(cbind(C1, C2) ~ ID , data= DF , FUN= mean)
DF_Wanted= merge(DF, DF2, by=c("ID"), all=TRUE)

答案 3 :(得分:0)

如果您要使用base创建新列,则只需计算所需的值并将其分配给列。要计算它,您可以获取ID等于其自身的每个C的平均值:

DF$avg.C1 <- sapply(1:nrow(DF), function(i) mean(DF$C1[DF$ID==DF$ID[i]]))
DF$avg.C2 <- sapply(1:nrow(DF), function(i) mean(DF$C2[DF$ID==DF$ID[i]]))

答案 4 :(得分:0)

已经发布了一些好的答案,但我很惊讶没有人提到ave(),这基本上是为了这个目的而设计的;它甚至可以在没有任何刺激的情况下运行mean()

cbind(DF,avg.C1=ave(DF$C1,DF$ID),avg.C2=ave(DF$C2,DF$ID));
##   ID C1 C2 avg.C1 avg.C2
## 1  A  3  3    3.5    3.0
## 2  C  2  7    2.5    5.5
## 3  A  4  3    3.5    3.0
## 4  C  3  4    2.5    5.5
## 5  E  6  5    5.5    3.0
## 6  F  7  2    7.0    2.0
## 7  E  5  1    5.5    3.0