过去几年的回报值

时间:2016-07-30 14:58:42

标签: r

这里的第一个问题,希望我已经正确地做到了这一点!

我有一个大型数据集,以下是一个小样本:

id <- c(1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6)
year <- c("2010", "2011", "2012", "2014", "2012", "2013", "2011", "2012", "2013", "2010", "2011", "2012", "2013", "2008", "2009", "2011")
value <- c(100, 33, 80, 90, 80, 100, 100, 90, 80, 90, 80, 100, 100, 90, 80, 99)

df <- data.frame(id, year, value)
df

对于每个id,我想返回连续两年的值,以便我可以将第n年的值与第n + 1年的值进行比较。如果没有连续两年,那么就不要为那个id返回任何东西。

输出应如下:

id <- c(1, 1, 2, 3, 3, 4, 4, 4, 5)
year <- c("2010", "2011", "2012", "2011", "2012", "2010", "2011", "2012", "2008")
yvalue <- c(100, 33, 80, 100, 90, 90, 80, 100, 90)
yearadd1 <- c("2011", "2012", "2013", "2012", "2013", "2011", "2012", "2013", "2009")
valueadd1 <- c(33, 80, 100, 90, 80, 80, 100, 100, 80)

df <- data.frame(id, year, yvalue, yearadd1, valueadd1)
df

如何让r给我这个输出? 我面临的主要困难是,对于id = 1,第一对连续年份是2010年和2011年,而对于id = 4,它们是2008年和2009年,所以我不能定义第一年是什么,因为它因id而异。

1 个答案:

答案 0 :(得分:0)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df)),按'id'分组,我们遍历列'year','value'并使用{获得lead观察{1}},将其分配(shift)到新列并删除NA行(:=)。然后获取行'id(na.omit),其中'yearadd1'中的连续元素等于1,并提取这些行。

.I