不同类别因素的欧几里得距离按组迭代

2024-02-28

*更新: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 解决方案。

预先非常感谢您的帮助。


我相信下面的函数可以满足问题的要求,但是结果Firm == "B"不等于问题的。

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不同类别因素的欧几里得距离按组迭代 的相关文章

  • 一段 R 代码会影响 foreach 输出中的随机数吗?

    我使用运行模拟foreach and doParallel并与随机数 名为random在代码中 简而言之 我模拟一个足球联赛 随机生成所有比赛的获胜者以及相应的结果 在dt base没有比赛进行 在dt ex1 and dt ex24场比赛
  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • 无法更新/编辑从 R 中的包(`gratia`)导出的 ggplot2 对象

    我希望我在这里遗漏了一些令人痛苦的明显的东西 我希望更新 例如 修复标题 实验室等 由 生成的 ggplot 对象gratia draw 不太确定为什么我无法更新该对象 有一个简单的解决方案吗 devtools install github
  • 如何在 Caret 中绘制随机森林(护林员)树

    我生成了如下所示的随机森林树 并尝试绘制它 但出现错误 我在哪里犯了错误 我怎样才能以正确的方式绘制它 Actmodel lt train Activity Section Author data CB1 method ranger trC
  • R、Rcpp 与 Armadillo 中矩阵 rowSums() 与 colSums() 的效率

    背景 来自 R 编程 我正在扩展到 C C 形式的编译代码Rcpp 作为循环交换 以及一般的 C C 效果的实践练习 我实现了 R 的等效项rowSums and colSums 矩阵的函数Rcpp 我知道它们以 Rcpp 糖的形式存在 并
  • R 可以创建带有可单击条形图的条形图图像以插入网页吗?

    我知道如何创建条形图 以及如何将其粘贴在网页上 例如 使用hwriteImage in the 作家包 http www embl de gpau hwriter 我想要的是每个栏都是一个在鼠标悬停时突出显示的区域 并且每个栏在单击时都有不
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • R 中两个时间戳之间的左连接

    我的目标是执行左连接intervals哪里的bike id比赛和created at时间戳在records在 之间start and end in the intervals table gt class records 1 data ta
  • 访问或解析 R 中的 summary() 中的元素

    我运行以下 R 命令来进行 Dunnett 测试并获取摘要 如何访问下面线性假设的每一行 这是摘要输出的一部分 基本上我不知道摘要的结构 我尝试使用名称 但它似乎不起作用 因为我没有看到任何命名属性来提供这一点 library multco
  • 警告消息 - 来自 dummies 包的 dummy

    我正在使用 dummies 包为分类变量生成虚拟变量 其中一些变量具有两个以上类别 testdf lt data frame A as factor c 1 2 2 3 3 1 B c A B A B C C C c D D E D D E
  • 需要在R中按行绑定列表数据

    我在 R 中按行绑定列表时遇到问题 我的列表数据集是 id 1 data k 1 id k b c 1 1 1 3 data k 2 id k b c 1 2 1 4 id 2 data k 1 id k b c 2 1 1 6 data
  • 在R中循环子文件夹

    我正在 R 环境中包含多个子文件夹的文件夹中工作 我想要循环遍历多个子文件夹 然后在每个子文件夹中调用 R 脚本来执行 我想出了下面的代码 但我的代码似乎添加了 到子文件夹列表 我收到错误 文件中的错误 文件名 r 编码 编码 无效的 描述
  • 如何按时间间隔匹配数据帧?

    这是我从数据记录器导入原始数据时经常出现的问题 温度记录仪设置为每十分钟记录一次温度 单独的气体记录仪设置为记录最后十分钟间隔内使用的气体 我想将这两个记录器的数据合并到一个数据框中进行绘图和分析 但时间并不完全一致 我希望每十分钟的时间段
  • 绘制 Cox 回归的 Kaplan-Meier 图

    我使用 R 中的以下代码设置了一个 Cox 比例风险模型来预测死亡率 添加协变量 A B 和 C 只是为了避免混淆 即年龄 性别 种族 但我们真正对预测变量 X 感兴趣 X 是一个连续变量 cox model lt coxph Surv t
  • 我可以使用哪个 R 函数来查找两条线的交点?

    我刚刚研究了 stackoverflow 上所有的 在 R 中寻找交集 问题 它们要么是关于曲线 要么是关于分布像这个 https stackoverflow com questions 20519431 finding point of
  • 行对名称中具有特定模式的列求和

    我有一个像这样的数据表 DT lt ata table data table ref rep 3L 4L nb 12 15 i1 c 3 1e 05 0 044495 0 82244 0 322291 i2 c 0 000183 0 155
  • R ggplot 中的柯尔莫哥洛夫-斯米尔诺夫图

    我正在尝试在 r 中绘制 KS 图 一切似乎都很顺利 除了我只能使用颜色来可视化两个不同的样本而不是线型这一事实 我已经尝试过以下方法 sample1 lt SD13009 sample2 lt SD13009PB group lt c r
  • 更新 R6 对象实例中的方法定义

    如何更新 R6 类实例的方法定义 正如我所期望的 S3 使用当前的方法定义 对于 R5 参考类 我可以使用 myInstance myInstance copy 在 R6 中 我尝试了 myInstance myInstance clone
  • 从数据框中绘制多条平滑线

    我对 R 比较陌生 我正在尝试绘制从 csv 文件加载的数据框 数据由 6 列组成 如下所示 xval col1 col2 col3 col4 col5 第一列 xval 由一系列单调递增的正整数 例如 10 40 60 等 组成 其他列
  • 增加雷达图中长轴标签的空间

    我想创建一个雷达图ggirahExtra ggRadar 问题是我的标签很长并且被剪掉了 我想我可以通过添加在标签和绘图之间创建更多空间margin margin 0 0 2 0 cm to element text in axis tex

随机推荐