R从数据集中的定制子集中获取分位数和均值

R Obtain quantile and mean from a tailored subset in the dataset

我想获得定制子集中的分位数。例如在以下数据集中:

data = data.table(x=c(rep(1,9),rep(2,9)),y=c(rep(1:6,each=3)),z=1:18)
  1. 对于每一行 i,我想知道,在 x=x[i] 和 [=21= 的行中]y=z[i][=33的50%分位数(以及进一步计算中的其他分位数,例如10%分位数,5%分位数) =].

预期的输出是

c(2,2,2,3.5,3.5,3.5,5,5,5,11,11,11,12.5,12.5,12.5,14,14,14)
  1. 对于每一行 i,我想知道,在 x=x[i] 和 [=21= 的行中]y=z[i].
  2. 的平均值

预期输出将是(与此数据集中的 1 相同,但在其他数据集中会有所不同)。

c(2,2,2,3.5,3.5,3.5,5,5,5,11,11,11,12.5,12.5,12.5,14,14,14)

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

使用 non-equi 加入 data.table

data[data, quantile(z, 0.5), on = .(x = x, y <=y), by = .EACHI]$V1
#[1]  2.0  2.0  2.0  3.5  3.5  3.5  5.0  5.0  5.0 11.0 11.0 11.0 12.5 12.5 12.5 14.0 14.0 14.0

如果我们要创建一个列

data[data[unique(data[, .(x, y)]), quantile(z, 0.5), 
  on = .(x = x, y <=y), by = .EACHI], z_mean := V1, on = .(x, y)]

-输出

> data
        x     y     z z_mean
    <num> <int> <int>  <num>
 1:     1     1     1    2.0
 2:     1     1     2    2.0
 3:     1     1     3    2.0
 4:     1     2     4    3.5
 5:     1     2     5    3.5
 6:     1     2     6    3.5
 7:     1     3     7    5.0
 8:     1     3     8    5.0
 9:     1     3     9    5.0
10:     2     4    10   11.0
11:     2     4    11   11.0
12:     2     4    12   11.0
13:     2     5    13   12.5
14:     2     5    14   12.5
15:     2     5    15   12.5
16:     2     6    16   14.0
17:     2     6    17   14.0
18:     2     6    18   14.0