我正在尝试使用data.table
小插图ansible-local provisioner Configuration Reference中描述的方法对data.table
进行分组:
flights[.(c("LGA", "JFK", "EWR"), "XNA"), on = c("origin", "dest"), mult = "last"]
(mult
参数与此无关。)
这是一个可重现的例子,解释了我的问题:
f <- function(n) {
set.seed(1)
DT <- data.table(V1=sample.int(1000,n,replace=TRUE),
V2=sample.int(1000,n,replace=TRUE))
return(c(
DT[V1%in%400:600 & V2%in%800:1000, .N],
DT[.(400:600,800:1000), .N, on=c("V1","V2")]
))
}
基于模板,我期望得到n
的任何值的长度为2的重复向量。但是:
> f(100)
[1] 2 201
> f(1000)
[1] 50 201
> f(10000)
[1] 392 201
>
我试图复制的on=
的简写方法总是给出值201.如果我修改函数有点像这样:
f2 <- function(n) {
set.seed(1)
DT <- data.table(V1=sample.int(1000,n,replace=TRUE),
V2=sample.int(1000,n,replace=TRUE))
return(c(
DT[V1%in%400:600 & V2%in%800:900, .N],
DT[.(400:600,800:900), .N, on=c("V1","V2")]
))
}
然后很明显,在子集化所基于的两个值向量之间存在回收问题,即400:600
和800:900
:
> f2(100)
[1] 2 201
Warning message:
In as.data.table.list(i) :
Item 2 is of size 101 but maximum size is 201 (recycled leaving a remainder of 100 items)
显然,400:600
的长度为201,长度为101的800:900
,但我并不认为他们俩彼此有任何关系。我在其他示例中使用了完全相同的方法,并且它按预期工作。有人知道我做错了吗?