r - 如何访问 R 的链式 data.table 中的行名
问题描述
我们有时需要行名来创建一个新列,该列是先前列的函数,但仅针对一行(每一行)进行聚合。换句话说,该函数正在跨行运行。
考虑一下:
library(data.table)
library(geosphere)
dt <- data.table(lon=77+rnorm(100),lat=13 + rnorm(100),i.lon=77+rnorm(100),i.lat=13 + rnorm(100))
dt[,dist:=distGeo(p1=c(lon,lat),p2=c(i.lon,i.lat)),by=rownames(dt)] # correct
第二行代码工作正常,因为dt
方括号内有 data.table 名称(它本身对我来说看起来不太优雅),但并非总是如此。
如果有一个 data.tables 链怎么办?考虑前面示例的扩展:
dt[lon>77 & lat<12.5][,dist:=distGeo(p1=c(lon,lat),p2=c(i.lon,i.lat)),by=rownames(dt)] # incorrect
显然,这是一个不正确的使用,因为rownames(dt)
它的长度与传递给下一个链的子集 data.table 的长度不同。
我想我更大的问题是:rownames()
对每一行进行总结的唯一方法是什么?如果不是,那么具体问题仍然存在:by=
如果它是链式 data.table,我们如何访问构造内部的 data.table?
解决方案
尝试cbind
:
dt <- data.table(lon=77+rnorm(100),lat=13 + rnorm(100),i.lon=77+rnorm(100),i.lat=13 + rnorm(100))
dt[,dist:=distGeo(p1=cbind(lon,lat),p2=cbind(i.lon,i.lat))]
# correct : 100 lines
dt[lon>77 & lat<12.5][,dist:=distGeo(p1=cbind(lon,lat),p2=cbind(i.lon,i.lat))]
# also correct : 16 lines
:=
无需汇总即可处理每一行。
cbind
允许向函数提供扩展的 n*2 lat-lon 矩阵。
推荐阅读
- node.js - Redis 错误“已达到最大客户端数”
- c++ - 如何在文件属性的高级安全选项卡中找到“继承自”字段?
- node.js - Create-React-App (CRA) 在创建新的 React 应用程序时卡住
- types - VHDL 错误 (10479):已使用索引名称类型但未声明
- r - 如何将数据分成指定比例的两部分不是随机的
- python - python随机选择没有重复
- java - 在单元测试之前从 .sql 预加载数据会引发语法错误
- magento - Magento 1:mysql-4 升级脚本不起作用
- wcf - ADAL - 访问令牌在 1 小时后过期并且没有获得刷新令牌
- jenkins - Jenkins 声明式管道构建失败 - 节点丢失