首页 > 解决方案 > 如何访问 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?

标签: rdata.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 矩阵。


推荐阅读