首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >群迭代的不同因子类的欧氏距离

群迭代的不同因子类的欧氏距离
EN

Stack Overflow用户
提问于 2021-04-28 11:53:03
回答 1查看 96关注 0票数 2

*更新: Rui建议的答案很好,而且工作正常。然而,当我在大约700万个观察值(我的实际数据集)上运行它时,R被一个计算块卡住了(我使用的机器有64 of的RAM)。任何其他的解决方案都是非常感谢的!

我有一个由公司、申请年限、专利号和专利类别组成的专利数据框架。我想根据以下公式计算每家公司基于专利类别的连续年份之间的欧几里德距离:

![](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7B%5Csqrt%5B%5D%7B%20%5Csum%20%7Bi%7D-Y%7Bi%7D%5E%7B%7DX%7Bi%7D%5E%7B%7DY_%7Bi%7D%5E%7B2%7D%7D%20%5Cright%29%20%7D%20%5C)

其中Xi表示第t年属于特定类别的专利数量,Yi表示前一年属于特定类别的专利数量( t -1)。

为了进一步说明这一点,请考虑以下数据集:

代码语言:javascript
复制
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的开始年,因此不存在该年的欧几里德距离(应该产生NAs。展望1991年,今年(1991)和前一年(1990)的不同类别是31、5和12。因此,上述公式在这三个不同类别(有三个差异)上求和。因此,该公式的输出将为:

![](https://chart.googleapis.com/chart?cht=tx&chl=%5Cfrac%7B%5Csqrt%7B(1-0%29%5E%7B2%7D%2B(0-1%29%5E%7B2%7D%2B(0-1%29%5E%7B2%7D%7D%7D%7B%5Cleft(%5Csqrt%7B(1%2B0%2B0%29%5E%7B2%7D%7D%5Cright%29%20%5Ctimes%5Cleft(%5Csqrt%7B(0%2B1%2B1%29%5E%7B2%7D%7D%5Cright%29%7D)

根据相同的计算和对公司的重申,最终产出应该是:

代码语言:javascript
复制
> 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解决方案。

非常提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-28 14:14:51

我相信下面的函数做了问题所要求的,但是Firm == "B"的结果不等于问题的结果。

代码语言:javascript
复制
fEl_Dist <- function(X){
  Year <- X[["Year"]]
  PatentClass <- X[["Patent_Class"]]
  sapply(seq_along(Year), function(i){
    j <- which(Year %in% (Year[i] - 1:0))
    tbl <- table(Year[j], PatentClass[j])
    if(NROW(tbl) == 1){
      NA_real_
    } else {
      numer <- sum((tbl[2, ] - tbl[1, ])^2)
      denom <- sum(tbl[2, ]^2)*sum(tbl[1, ]^2)
      sqrt(numer/denom)
    }
  })
}
  
setDT(df)[, El_Dist := fEl_Dist(.SD), 
          by = .(Firm),
          .SDcols = c("Year", "Patent_Class")]

head(df)
#   Firm Year Patent_Number Patent_Class   El_Dist
#1:    A 1990        190948           12        NA
#2:    A 1990        186156            5        NA
#3:    A 1991        190801           31 1.2247449
#4:    A 1992        185226           12 0.7071068
#5:    A 1992        185900           31 0.7071068
#6:    A 1993        186928            6 1.2247449
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67293531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档