在聚合内部使用循环但是从不同的组中绘制?

时间:2015-03-06 19:14:22

标签: r loops aggregate

我不知道怎么想出自己的方式。这是我的数据:

group <- c(1, 1, 1, 2, 2, 2, 2, 2, 3, 1, 1, 1, 2, 2)
gdp <- c(3.5, 4.2, 5, 4, 4.2, 5, 5.5, 6, 3.5, 3.4, 4.0, 4.1, 4.3, 4.7)
year <- c(rep(1970, 9), rep(1971, 5))
df <- data.frame(group, gdp, year) 

  group gdp year
1   1   3.5 1970
2   1   4.2 1970
3   1   5.0 1970
4   2   4.0 1970
5   2   4.2 1970
6   2   5.0 1970
7   2   5.5 1970
8   2   6.0 1970
9   3   3.5 1970
10  1   3.4 1971
11  1   4.0 1971
12  1   4.1 1971
13  2   4.3 1971
14  2   4.7 1971

我想执行以下操作:对于每个year,我想找到gdp中最后一个变量与下一个group中的第一个变量group之间的差异1}}。例:gdp btwn第3行和第4行与btwn第8行和第9行等有什么区别。显然需要自动化,因为实际数据集很大。

我正在尝试使用聚合中的函数---聚合将由year执行,而函数将是for loop滚动每个group,但之后我的能够将我想做的事情翻译成代码的能力崩溃了。如何识别组中的最后一个变量并使用下一组中的第一个变量进行计算?我没有熟练的索引编排来解决这个问题。建议?

2 个答案:

答案 0 :(得分:1)

dplyr解决方案类似于@akrun在评论列中的data.table解决方案

library(dplyr)
df %>% group_by(year, group) %>% 
    summarise(x1 = gdp[1], x2 = gdp[n()]) %>% 
    mutate(dff = x1 - lag(x2)) %>% 
    na.omit %>% select(-x1, -x2)
#  year group  dff
#1 1970     2 -1.0
#2 1970     3 -2.5
#3 1971     2  0.2

答案 1 :(得分:0)

我们可以使用data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df))。获取每个分组变量(gdp[1L])的第一个元素(gdp[.N])和最后一个元素(.(group, year))。在删除第一个和最后一个观察到的&#39; V1&#39;之后,减去新变量(&#39; V1&#39;)和(&#39; V2&#39;)。和&#39; V2&#39;分别为每个&#39;年。

library(data.table)
setDT(df)[, list(gdp[1L], gdp[.N]) ,.(group, year)][,
                         V1[-1L]-V2[-.N], year]
#   year   V1
#1: 1970 -1.0
#2: 1970 -2.5
#3: 1971  0.2

如果我们需要&#34;组&#34;专栏

setDT(df)[, list(gdp[1L], gdp[.N]), , .(group, year)][,
 list(group=group,dff=V1-shift(V2)) , year][complete.cases(dff)]
 #   year group  dff
#1: 1970     2 -1.0
#2: 1970     3 -2.5
#3: 1971     2  0.2