在使用二级索引进行子集化时,使用多列进行意外回收

时间:2017-02-22 21:46:59

标签: r data.table

我正在尝试使用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:600800: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,但我并不认为他们俩彼此有任何关系。我在其他示例中使用了完全相同的方法,并且它按预期工作。有人知道我做错了吗?

0 个答案:

没有答案