我再次提出了一个问题,即在使用大型数据库的情况下有效地进行一些没有循环的计算。
底层不平衡面板数据集采用下面的df1形式。可以看出,存在不同年份的个体(ID)。有时候还有瞎年(见ID 4):
library(data.table)
df1 = data.table( Year = c(2000, 2001,2002, 2003, 2000, 2001, 2000,
2001,2002, 2003, 2004, 2001,2003,2004),
ID = c(1,1,1,1,2,2,3,3,3,3,3,4,4,4),
V1 = c(10, 9, 8,11, 2,3, 16,12,15,16,20, 8,7,9),
V2 = c(2,3,2,4,0.5,1, 4,6,5,8,9, 8,10,11)
)
我想创建一个变量V3,其中为每个ID V1 / V2计算第一年的观察时间。在接下来的观察年中,维护或复制该值。 请参阅下面df2中所需的输出:
df2 = data.table( Year = c(2000, 2001,2002, 2003, 2000, 2001, 2000,
2001,2002, 2003, 2004,2001,2003,2004),
ID = c(1,1,1,1,2,2,3,3,3,3,3,4,4,4),
V1 = c(10, 9, 8,11, 2,3, 12,16,15,16,20, 8,7,9),
V2 = c(2,3,2,4, 0.5,1, 4,6,5,8,9 ,8,10,11),
V3 = c(5,5,5,5,4,4,3,3,3,3,3, 1,1,1 )
)
答案 0 :(得分:1)
您可以使用first
中的data.table
来计算第一年(假设您的数据已订购),即
library(data.table)
df1[, v3 := first(V1)/first(V2), by = ID][]
注意:您的数据存在一些差异(第8行),因此结果与您发布的内容不同