【发布时间】:2018-04-30 08:57:46
【问题描述】:
我有一个包含距离的数据表。我想通过我的“id”变量和包含距离阈值(e.g. Dist<1, Dist<2, etc.). 在 data.table 中运行各种操作我知道如何通过 id 和距离"by=list(id,Dist)" 运行操作,但我真的想要一个 by 变量更像, "by=list(id,c(Dist<=1,Dist<=2,Dist<=3,Dist<=4,Dist<=5)。下面是我的数据结构和目标的示例。
#load library
library(data.table)
#create data
set.seed(123L)
dt<-data.table(id=factor(rep(1:10,5)),V1=rnorm(50,5,5),Dist=sample(1:5,50,replace=T))
#calculate mean of V1 by id and distance (wrong results)
dt2<-dt[,.(MeanV1=mean(V1)),by=list(id,Dist)]
#calculate mean of V1 by id and conditional distance (right results, wrong method)
dt2.1<-dt[Dist<=1,.(MeanV1=mean(V1)),by=id]
dt2.2<-dt[Dist<=2,.(MeanV1=mean(V1)),by=id]
dt2.3<-dt[Dist<=3,.(MeanV1=mean(V1)),by=id]
dt2.4<-dt[Dist<=4,.(MeanV1=mean(V1)),by=id]
dt2.5<-dt[Dist<=5,.(MeanV1=mean(V1)),by=id]
dt2<-rbind(dt2.1,dt2.2,dt2.3,dt2.4,dt2.5)
#ideal methods if either were valid
#syntax 1
dt2<-dt[,.(MeanV1=mean(V1)),by=list(id,c(Dist<=1,Dist<=2,Dist<=3,Dist<=4,Dist<=5))]
#syntax 2
rowindices<-list(dt$Dist<=1,dt$Dist<=2,dt$Dist<=3,dt$Dist<=4,dt$Dist<=5)
dt2<-dt[,.(MeanV1=mean(V1)),by=list(id,rowindices)]
提前致谢。
【问题讨论】:
-
dt[.(cutid = 1:5, dcut = 1:5), on=.(Dist <= dcut), allow.cartesian=TRUE][, mean(V1), keyby=.(cutid, id)]适用于该示例?不过,如果您要计算平均值,还有更有效的方法。 -
太棒了,非常感谢!!是的,我只是以平均值为例。我正在做一些比这更复杂的事情。再次感谢!
标签: r indexing data.table conditional