我不知道怎么想出自己的方式。这是我的数据:
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
,但之后我的能够将我想做的事情翻译成代码的能力崩溃了。如何识别组中的最后一个变量并使用下一组中的第一个变量进行计算?我没有熟练的索引编排来解决这个问题。建议?
答案 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