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)
- 对于每一行 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)
- 对于每一行 i,我想知道,在 x=x[i] 和 [=21= 的行中]y=
,z[i]. 的平均值
预期输出将是(与此数据集中的 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
我想获得定制子集中的分位数。例如在以下数据集中:
data = data.table(x=c(rep(1,9),rep(2,9)),y=c(rep(1:6,each=3)),z=1:18)
- 对于每一行 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)
- 对于每一行 i,我想知道,在 x=x[i] 和 [=21= 的行中]y=
,z[i]. 的平均值
预期输出将是(与此数据集中的 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