r 将数字与数据集中的定制子集进行比较

r Compare a number to a tailored subset in the dataset

我想计算在定制的子集中有多少行具有更大的数字。例如在以下数据集中:

data = data.table(x=c(rep(1,8),rep(2,8)),y=c(rep(1:8,each=2)),z=c(1,2,3,4,5,4,3,2,1,2,3,4,5,4,3,4))

对于每一行 i,我想知道,在 x=x[i] 和 [=20= 的行中]y,其中有多少个z大于z[i].

预期的输出是

c(0,0,0,0,0,0,3,4,0,0,0,0,0,0,3,1)

我可以为它编写一个函数并使用 apply 在每一行上循环它。但是,数据集有超过 30,000,000 行,这需要几天时间。在 R data.table 或 tidyverse 或其他包中有更快的计算方法吗?

我们可以为此使用 non-equi 连接

library(data.table)
data[data, .N, on = .(x = x, y < y, z > z), by = .EACHI]
        x     y     z     N
    <num> <int> <num> <int>
 1:     1     1     1     0
 2:     1     1     2     0
 3:     1     2     3     0
 4:     1     2     4     0
 5:     1     3     5     0
 6:     1     3     4     0
 7:     1     4     3     3
 8:     1     4     2     4
 9:     2     5     1     0
10:     2     5     2     0
11:     2     6     3     0
12:     2     6     4     0
13:     2     7     5     0
14:     2     7     4     0
15:     2     8     3     3
16:     2     8     4     1