R 计算矩阵列上的分位数
对于给定的矩阵,我需要通过分组变量跟踪每列的分位数值。具体来说,我想按“队列结构”对输出进行分组。然后对于第1列到第5列,我想计算每个分组变量的第25个、平均值和第75个百分位数。这意味着我的输出矩阵将是9 x 5。i、 e.每个队列结构3行=1,队列结构3行=2,队列结构3行=3,每个对应于第25个平均值和第75个百分位 例如:R 计算矩阵列上的分位数,r,dataframe,matrix,dplyr,R,Dataframe,Matrix,Dplyr,对于给定的矩阵,我需要通过分组变量跟踪每列的分位数值。具体来说,我想按“队列结构”对输出进行分组。然后对于第1列到第5列,我想计算每个分组变量的第25个、平均值和第75个百分位数。这意味着我的输出矩阵将是9 x 5。i、 e.每个队列结构3行=1,队列结构3行=2,队列结构3行=3,每个对应于第25个平均值和第75个百分位 例如: test.mat <- data.frame(matrix(nrow = 11, ncol =6)) colnames(test.mat)[[6]] = "Co
test.mat <- data.frame(matrix(nrow = 11, ncol =6))
colnames(test.mat)[[6]] = "Cohort Structure"
test.mat[,6]= c(1,1,1,1,1,1,2,2,3,3,3)
test.mat[1:11,4:5] <- rnorm(11*2,0,1)
test.mat[11, 5] <- NA
test.mat[1:3,1:3] <- rnorm(9,0,1)
X1 X2 X3 X4 X5 Cohort Structure
1 0.09529937 1.0140776 -0.45203406 -0.6585827 0.57117571 1
2 0.94442513 0.5777710 0.08588911 -0.3674672 0.01383938 1
3 1.47881362 0.4370171 -0.37843416 -1.2634002 0.58010696 1
4 NA NA NA 0.2844687 0.83113773 1
5 NA NA NA 0.8661393 0.35947394 1
6 NA NA NA -1.3685556 -0.71297431 1
7 NA NA NA -1.0117586 0.27020197 2
8 NA NA NA -0.7746377 0.97250990 2
9 NA NA NA -1.4406549 0.05538031 3
10 NA NA NA -0.2303378 -0.61625365 3
11 NA NA NA -0.1837904 NA 3
将是输出矩阵[1:3,1:3]的期望输出
quantile(test.mat[1:6,4], c(0.25,0.5,0.75))
将为输出矩阵[1:3,4]生成所需的输出
对于我的实际数据集,我需要使用
data.table
将该过程应用于包含100列的矩阵,我相信这会产生正确的输出。也许有一种更简洁的书写方式
library(data.table)
test.mat <- data.table(test.mat)
quantiles <- test.mat[, .(quantile(X1, c(0.25, 0.5, 0.75), na.rm = TRUE),
quantile(X2, c(0.25, 0.5, 0.75), na.rm = TRUE),
quantile(X3, c(0.25, 0.5, 0.75), na.rm = TRUE),
quantile(X4, c(0.25, 0.5, 0.75), na.rm = TRUE),
quantile(X5, c(0.25, 0.5, 0.75), na.rm = TRUE)),
by = 'Cohort Structure']
输出:
> quantiles
Cohort Structure V1 V2 V3 V4 V5 quantile
1: 1 -1.220385 -0.3937794 0.05349869 0.3436015 -0.76662468 0.25
2: 1 -1.127379 0.3001190 0.88924650 0.9198491 0.09188820 0.50
3: 1 -1.013713 0.4744223 1.04911208 1.3364680 0.90340622 0.75
4: 2 NA NA NA 0.2912628 -0.20866542 0.25
5: 2 NA NA NA 0.2968669 -0.07529148 0.50
6: 2 NA NA NA 0.3024710 0.05808246 0.75
7: 3 NA NA NA -1.0510155 -0.64431366 0.25
8: 3 NA NA NA -0.4571571 -0.24590377 0.50
9: 3 NA NA NA 0.1136005 0.15250612 0.75
编辑:
另一种适用于任意数量列的方法是:
quantiles <- test.mat[ , lapply(.SD, quantile, c(0.25, 0.5, 0.75), na.rm = TRUE), by = 'Cohort Structure']
quantiles[, quantile := c(0.25, 0.5, 0.75)]
这是可行的,但是,我需要它来处理一个有100列的矩阵。你知道如何轻松地扩展它吗?请看我的编辑,无论你有多少列,这都应该适用。
> quantiles
Cohort Structure V1 V2 V3 V4 V5 quantile
1: 1 -1.220385 -0.3937794 0.05349869 0.3436015 -0.76662468 0.25
2: 1 -1.127379 0.3001190 0.88924650 0.9198491 0.09188820 0.50
3: 1 -1.013713 0.4744223 1.04911208 1.3364680 0.90340622 0.75
4: 2 NA NA NA 0.2912628 -0.20866542 0.25
5: 2 NA NA NA 0.2968669 -0.07529148 0.50
6: 2 NA NA NA 0.3024710 0.05808246 0.75
7: 3 NA NA NA -1.0510155 -0.64431366 0.25
8: 3 NA NA NA -0.4571571 -0.24590377 0.50
9: 3 NA NA NA 0.1136005 0.15250612 0.75
quantiles <- test.mat[ , lapply(.SD, quantile, c(0.25, 0.5, 0.75), na.rm = TRUE), by = 'Cohort Structure']
quantiles[, quantile := c(0.25, 0.5, 0.75)]
> quantiles
Cohort Structure X1 X2 X3 X4 X5 quantile
1: 1 -0.7882032 1.026384 -1.1975511 -0.8922598 -0.14365438 0.25
2: 1 -0.5700479 1.053239 -0.7222268 0.4451031 0.03217004 0.50
3: 1 0.3405146 1.282465 -0.5917531 0.9224831 0.24087650 0.75
4: 2 NA NA NA 0.3324551 0.97672542 0.25
5: 2 NA NA NA 0.7927529 1.03910678 0.50
6: 2 NA NA NA 1.2530508 1.10148814 0.75
7: 3 NA NA NA -0.3269997 0.51067050 0.25
8: 3 NA NA NA 0.4094524 0.55328059 0.50
9: 3 NA NA NA 0.6502998 0.59589067 0.75