我想将2个数据框组合成一个列。我的数据如下:
station build Year Month
1 Bariko 24.5 1961 1
2 Bariko 29.1 1962 1
3 Bariko 26.4 1963 1
4 Bariko 29.0 1961 2
5 Bariko 22.0 1962 2
6 Bariko 25.9 1963 2
7 Bariko 24.2 1961 3
8 Bariko 23.9 1962 3
9 Bariko 24.4 1963 3
10 Bariko 24.0 1961 4
11 Bariko 24.2 1962 4
12 Bariko 24.8 1963 4
我按月计算构建的平均值。我可以在"意思"。
之后命名 newdata=aggregate(build ~ station +Month, data=data, mean, na.rm = TRUE)
1)我想结合"数据"和#34; newdata"(4行对应我的4个月),以便有一个12行和5列的数据框(我可以重复每个月的平均值)。
2)创建一个新的值列,对应于第2列和第5列之间的差异(data $ build-data $ mean)。最后我将有6列的数据(站点,构建,年,月,平均值,差异)。最后,我可以按年绘制差异。
谢谢,
答案 0 :(得分:2)
使用dplyr
:
station = "Bariko"
build = c(24.5, 29.1, 26.4, 29, 22, 25.9, 24.2, 23.9, 24.4, 24, 24.2, 24.8)
Year = c(1961,1962,1963)
Month = rep(1:4, each=3)
df<-data.frame(station,build,Year,Month)
df
dplyr使这些事情变得非常简单:
library(dplyr)
df %>%
group_by(Month) %>%
mutate(mean=mean(build)) %>%
mutate (diff= build-mean)
station build Year Month mean diff
1 Bariko 24.5 1961 1 26.66667 -2.16666667
2 Bariko 29.1 1962 1 26.66667 2.43333333
3 Bariko 26.4 1963 1 26.66667 -0.26666667
4 Bariko 29.0 1961 2 25.63333 3.36666667
5 Bariko 22.0 1962 2 25.63333 -3.63333333
6 Bariko 25.9 1963 2 25.63333 0.26666667
7 Bariko 24.2 1961 3 24.16667 0.03333333
8 Bariko 23.9 1962 3 24.16667 -0.26666667
9 Bariko 24.4 1963 3 24.16667 0.23333333
10 Bariko 24.0 1961 4 24.33333 -0.33333333
11 Bariko 24.2 1962 4 24.33333 -0.13333333
12 Bariko 24.8 1963 4 24.33333 0.46666667
答案 1 :(得分:2)
为了演示基础R中的替代方案(包含@ user20650在评论中建议的元素),within
+ ave
将成为一个优秀的团队。 ave
可以使用不同的功能,但默认值为mean
,因此您无需指定聚合功能。
within(df, {
Mean <- ave(build, station, Month)
Diff <- Mean - build
})
# station build Year Month Diff Mean
# 1 Bariko 24.5 1961 1 2.16666667 26.66667
# 2 Bariko 29.1 1962 1 -2.43333333 26.66667
# 3 Bariko 26.4 1963 1 0.26666667 26.66667
# 4 Bariko 29.0 1961 2 -3.36666667 25.63333
# 5 Bariko 22.0 1962 2 3.63333333 25.63333
# 6 Bariko 25.9 1963 2 -0.26666667 25.63333
# 7 Bariko 24.2 1961 3 -0.03333333 24.16667
# 8 Bariko 23.9 1962 3 0.26666667 24.16667
# 9 Bariko 24.4 1963 3 -0.23333333 24.16667
# 10 Bariko 24.0 1961 4 0.33333333 24.33333
# 11 Bariko 24.2 1962 4 0.13333333 24.33333
# 12 Bariko 24.8 1963 4 -0.46666667 24.33333
答案 2 :(得分:1)
使用data.table
包:
library(data.table)
dt <- data.table(df)
dt[, Mean := mean(build), by = Month]
dt[, Diff := Mean - build]
使用plyr
包:
library(plyr)
df <- ddply(df, "Month", transform, Mean = mean(build))
df$Diff = with(df, Mean - build)