计算比当前数字低的数字

Mak*_*oni 6 r rollover count rollapply data.table

想象一下,我有一个数字列表(即 data.table/data.frame 中的数字列)。

1
5
5
10
11
12
Run Code Online (Sandbox Code Playgroud)

对于列表中的每个数字,想要计算有多少个唯一数字低于该特定数字 + 5。

大写的解释,第一个数字=1,搜索范围是1+5=6,所以三个数字在范围内,小于或等于:c(1,5,5),然后count unique是2。这都是假设我们有附加条件,该数字不仅必须小于 current_number + 5,而且其在列表中的索引必须 >= current_number 的索引。

在这种情况下,结果将是:

2
2
2
3
2
1
Run Code Online (Sandbox Code Playgroud)

注意:data.framedata.table 中是否有针对庞大数据集的快速解决方案?我的数据集相当大,有 10+M 行。

nic*_*ola 7

我在基本 R 中能想到的最快方法(如果x已排序则有效):

findInterval(x + 5, unique(x)) - cumsum(!duplicated(x)) + 1L
#[1] 2 2 2 3 2 1
Run Code Online (Sandbox Code Playgroud)

编辑:排序没有问题,因为 with data.table,排序整数是微不足道的:

nr <- 1e7
nn <- nr/2
set.seed(0L)
DT <- data.table(X=sample(nn, nr, TRUE))
#DT <- data.table(X=c(1,5,5,10,11,12))

system.time(
    DT[order(X), 
        COUNT := findInterval(X + 5L, unique(X)) - cumsum(!duplicated(X)) + 1L
    ]
)
#   user  system elapsed 
#   1.73    0.17    1.53 
Run Code Online (Sandbox Code Playgroud)

2 秒表示 1000 万行。


zx8*_*754 6

尝试这个:

x <- c(1,5,5,10,11,12)

sapply(seq_along(x), function(i)
  sum(unique(x[i:length(x)]) <= (x[i] + 5)))
# [1] 2 2 2 3 2 1
Run Code Online (Sandbox Code Playgroud)

  • 对于 10M 行,不确定这是正确的解决方案。有数据表专家吗? (2认同)