*更新:Rui 建议的答案很棒并且可以正常工作。然而,当我在大约 700 万个观察值(我的实际数据集)上运行它时,R 陷入了计算块(我使用的是具有 64GB RAM 的机器)。任何其他解决方案将不胜感激!
我有一个专利数据框,其中包含公司、申请年份、专利号和专利类别。我想根据以下公式计算每个公司基于专利类别的连续年份之间的欧几里德距离:
其中Xi代表t年属于特定类别的专利数量,Yi代表上一年(t-1)属于特定类别的专利数量。
为了进一步说明这一点,请考虑以下数据集:
df <- data.table(Firm = rep(c(LETTERS[1:2]),each=6), Year = rep(c(1990,1990,1991,1992,1992,1993),2),
Patent_Number = sample(184785:194785,12,replace = FALSE),
Patent_Class = c(12,5,31,12,31,6,15,15,15,3,3,1))
> df
Firm Year Patent_Number Patent_Class
1: A 1990 192473 12
2: A 1990 193702 5
3: A 1991 191889 31
4: A 1992 193341 12
5: A 1992 189512 31
6: A 1993 185582 6
7: B 1990 190838 15
8: B 1990 189322 15
9: B 1991 190620 15
10: B 1992 193443 3
11: B 1992 189937 3
12: B 1993 194146 1
由于 1990 年是公司 A 的起始年,因此该年没有欧几里得距离(应生成 NA)。前进到 1991 年,今年 (1991) 和前一年 (1990) 的不同类别为 31, 5和12。因此,上面的公式是对这三个不同的类(有三个不同的“i”)求和。所以公式的输出将是:
按照相同的计算并对企业进行重申,最终的输出应该是:
> df
Firm Year Patent_Number Patent_Class El_Dist
1: A 1990 192473 12 NA
2: A 1990 193702 5 NA
3: A 1991 191889 31 1.2247450
4: A 1992 193341 12 0.7071068
5: A 1992 189512 31 0.7071068
6: A 1993 185582 6 1.2247450
7: B 1990 190838 15 NA
8: B 1990 189322 15 NA
9: B 1991 190620 15 0.5000000
10: B 1992 193443 3 1.1180340
11: B 1992 189937 3 1.1180340
12: B 1993 194146 1 1.1180340
出于速度目的,我最好寻找 data.table 解决方案。
预先非常感谢您的帮助。