通过R中的特定观察对数据进行分组

时间:2017-02-10 17:41:10

标签: r

我想创建一个新变量,该变量来自我现有变量中的特定值。我的数据框如下所示:

year <- c("2010", "2011", "2012", "2013", "2014", "2015")
x <- c(2980, 2955, 3110, 2962, 2566, 3788)
y <- c(2453, 2919, 2930, 2864, 2873, 3031)
df <-  data.frame(year, x, y)

更具体地说,我想创建第三列z,即xy的比率。但是,我不想通过将x除以y每个单独年份来创建此比率。相反,我希望2015年(和2014年等)的价值是前三年(即2014年,2013年和2012年)的平均值。

我查看了Wickham的dplyr套餐,特别是group_by功能,但我很难过,因为我不想分组我的数据按年份而不是按年份计算。如上所述(希望如上),前三年。

4 个答案:

答案 0 :(得分:1)

使用dplyr和library(zoo)

df_fin<- df %>% mutate( z = rollmeanr(x/y,3,na.pad=TRUE))

我认为列z是你想要的,但最好有所需的输出。

答案 1 :(得分:0)

df$z<-0
for (i in 4:6){
  df$z[i]<-mean(df$x[(i-3):(i-1)])/mean(df$y[(i-3):(i-1)])
}

打开一个循环,你可以得到这个:

  year    x    y        z
1 2010 2980 2453 0.000000
2 2011 2955 2919 0.000000
3 2012 3110 2930 0.000000
4 2013 2962 2864 1.089497
5 2014 2566 2873 1.036038
6 2015 3788 3031 0.996654

答案 2 :(得分:0)

library(zoo)
library(dplyr)

df %>% mutate(z = x/y, zz = rollmean(z, 3, fill = NA)

答案 3 :(得分:0)

使用zoo::rollmean的答案都在正确的轨道上,但他们有一些&#34;关闭一个&#34;他们的错误。首先,您实际上需要zoo::rollmeanr( ..., na.pad=TRUE ),它会在左侧使用NA正确填充输出:

> zoo::rollmeanr( df$x / df$y, 3, na.pad=TRUE )
[1]        NA        NA 1.0962018 1.0359948 0.9962648 1.0590378

第二个&#34;关闭一个&#34;此向量与其余数据的对齐产生错误。根据您的描述,您希望2015年的价值是2014年,2013年和2012年的平均值。但是,将上面的矢量附加到您的表格中会使2015年的价值成为2015年,2014年和2013年的平均价值,而不是。要更正,您希望省略输入中滚动平均值的最后一个值并添加NA以进行补偿:

> c( NA, zoo::rollmeanr( head(df$x / df$y,-1), 3, na.pad=TRUE ) )
[1]        NA        NA        NA 1.0962018 1.0359948 0.9962648

使用dplyr表示法将所有内容放在一起:

df %>% mutate( z = c( NA, zoo::rollmeanr( head(x/y,-1), 3, na.pad=TRUE ) ) )
  year    x    y         z
1 2010 2980 2453        NA
2 2011 2955 2919        NA
3 2012 3110 2930        NA
4 2013 2962 2864 1.0962018
5 2014 2566 2873 1.0359948
6 2015 3788 3031 0.9962648