在R中逐个地连接数据帧

时间:2014-08-30 17:52:45

标签: r plyr

我想将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列的数据(站点,构建,年,月,平均值,差异)。最后,我可以按年绘制差异。

谢谢,

3 个答案:

答案 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)