2014-08-30 52 views
0

我想将2个数据帧合并成一列。我的数据如下所示:在R中逐列连接数据帧

 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)欲“数据”和“newdata”结合(与对应于我的4个月4行),以便具有12行和5列的数据帧(I可以重复意味着值每一个月)。

2)创建一个对应于第2列和第5列(数据$ build-data $ mean)差异的新值列。最后,我将获得6列的数据(电台,版本,年份,月份,平均值,差异)。最后,我可以绘制每年的差异。

谢谢

+1

'ave'能做出这样更容易一点'$逸MN < - 带(DAT,AVE(建设,列表(站,日),FUN =平均))' – user20650 2014-08-30 17:57:50

回答

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

随着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) 
+1

@ 510947,如果你想建议对此答案进行改进,在评论中进行修改,而不是通过强行将其置入答案本身 – 2014-08-30 18:20:00

+4

好吧..然后你就可以了 - 对于第二个例子,你可以使用mutate,这会为你节省一个步骤,就像这个'ddply (DF,(月),变异,平均=平均(构建),DIFF =构建均值)' – sidpat 2014-08-30 20:00:19

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