说我使用此代码生成数据
month<-c(rep(1,7),rep(2,7),rep(3,7))
date<-rep(c(rep(1,2),rep(2,3),rep(3,2)),3)
value<-rnorm(21)
df<-cbind(month,date,value))
所以现在我有类似的东西
month date value
[1,] 1 1 -0.04256470
[2,] 1 1 -2.50922102
[3,] 1 2 -0.50458814
[4,] 1 2 -1.00133322
[5,] 1 2 0.70297514
[6,] 1 3 0.79316448
[7,] 1 3 0.66798947
[8,] 2 1 1.60548790
[9,] 2 1 -0.42484680
[10,] 2 2 -0.33906887
[11,] 2 2 1.02457883
[12,] 2 2 0.64175917
[13,] 2 3 -0.03832247
[14,] 2 3 0.86878829
[15,] 3 1 1.46691690
[16,] 3 1 0.77897932
[17,] 3 2 -1.02759643
[18,] 3 2 0.15902324
[19,] 3 2 1.36580741
[20,] 3 3 -1.70749048
[21,] 3 3 0.11327990
我如何计算一个月内某个特定日期的平均值?
所以在这种情况下我希望我的输出看起来像这样......
month date avgvalue
1 1 -1.27589
1 2 -0.267649
1 3 0.66798947
2 1 0.590321
...
我真的很感谢帮助,谢谢你们。)
答案 0 :(得分:2)
您可以使用aggregate
:
aggregate(df[,3], by=list(month=df[,1], date=df[,2]), mean)
# month date x
# 1 1 1 0.5661431
# 2 2 1 0.1843661
# 3 3 1 1.8339898
# 4 1 2 1.2053077
# 5 2 2 -0.2575551
# 6 3 2 -0.4464268
# 7 1 3 -0.7154689
# 8 2 3 0.7895702
# 9 3 3 0.4853081
答案 1 :(得分:1)
library("plyr")
df <- data.frame(df)
ddply(df, .(month,date), summarize, avgvalue=mean(value))
答案 2 :(得分:1)
您使用tapply
标记了您的问题,因此这里有一个tapply
答案:
tapply(df[, "value"], INDEX=list(df[, "month"], df[, "date"]), FUN=mean)
# 1 2 3
# 1 -0.42965680 0.6943236 0.04505399
# 2 0.55021401 -0.3138895 -0.40966078
# 3 0.05676266 0.5212944 0.12521106
data.frame(as.table(
tapply(df[, "value"], INDEX=list(df[, "month"], df[, "date"]), FUN=mean)))
# Var1 Var2 Freq
# 1 1 1 -0.42965680
# 2 2 1 0.55021401
# 3 3 1 0.05676266
# 4 1 2 0.69432363
# 5 2 2 -0.31388954
# 6 3 2 0.52129439
# 7 1 3 0.04505399
# 8 2 3 -0.40966078
# 9 3 3 0.12521106
但更常见的方法是aggregate
(提及),plyr
(提及),data.table
和(最近)dplyr
。 data.table
和dplyr
方法如下。
library(data.table)
DT <- data.table(df)
DT[, mean(value), by = list(month, date)]
library(dplyr)
DF <- data.frame(df)
DF %.% group_by(month, date) %.% summarise(mean(value))
少常见的是ave
+ unique
:
unique(within(data.frame(df), {
MV <- ave(value, month, date)
rm(value)
}))
但是他们都会把你送到同一个地方。