我有这个数据框(从@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
答案 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