通过列表的 dfs 的分位数函数

quantile function through dfs of list

我有一个包含 1800 个 .csv 文件的 zip (48GB),每个文件有 365 列(天)和 22700 行(观察)。我需要根据选定数量的 csv 文件计算每次观察的分位数(5%、50% 和 95%)。

到目前为止,这是我的策略:

首先,我列出了以下选择的.csv文件:

# selected csv
cas_list <-pharma$CAS.Number
cas_list <- paste0(cas_list, "_Ctot.csv")  #only 105 .csv files

# identify zipped file
zipped_file = "ctot_minus_invalids.zip"

# list selected csv
lst = vector("list", length(cas_list))

for (i in seq_along(cas_list))
  lst[[i]] = read.csv(unz(zipped_file, cas_list[i]), stringsAsFactors = F, check.names=FALSE)

到目前为止一切顺利,我最终得到了一个具有以下结构的大列表(105 个元素,7GB):

> str(lst[1])
List of 1
 $ :'data.frame':   22731 obs. of  368 variables:
  ..$                 : int [1:22731] 8000005 8115258 8115717 8000008 8102609 8103951 8000007 8000006 8205878 8205857 ...
  ..$ 2012/12/31_Cbulk: num [1:22731] 0.000000000000584 0.000000000008771 0.000000000006266 0.000000000000214 0.000000000004982 ...
  ..$ 2013/01/01_Cbulk: num [1:22731] 0.000000000000468 0.000000000007096 0.000000000005331 0.000000000000214 0.000000000004968 ...
  ..$ 2013/01/02_Cbulk: num [1:22731] 0.000000000000437 0.000000000005835 0.000000000005354 0.000000000000215 0.000000000004954 ...

> str(lst[2])
List of 1
 $ :'data.frame':   22731 obs. of  368 variables:
  ..$                 : int [1:22731] 8000005 8115258 8115717 8000008 8102609 8103951 8000007 8000006 8205878 8205857 ...
  ..$ 2012/12/31_Cbulk: num [1:22731] 0.0000000000427 0.0000000006187 0.0000000004663 0.0000000000141 0.0000000003348 ...
  ..$ 2013/01/01_Cbulk: num [1:22731] 0.0000000000346 0.0000000005025 0.0000000004001 0.0000000000141 0.0000000003339 ...
  ..$ 2013/01/02_Cbulk: num [1:22731] 0.0000000000324 0.0000000004151 0.0000000004008 0.0000000000141 0.0000000003331 ...

虽然这种方法似乎非常占用内存,但它确实有效!。 现在,我的问题是关于如何通过整个列表中每个 df 的每个观察来应用分位数函数。为了让列表中的每个 df 都像这样:

                   5%         50%       95%
 8000005   -0.6125624  0.09364346 2.0342648
 8115258   -1.4404549 -0.40036638 1.3918166
 8115717   -1.5614326 -0.08835999 1.5153081
 .... so on

我试过以下代码:

result <- lapply(lst, function(x) {
  
  t(lapply(lst[i], quantile, probs = c(0.05, 0.5, 0.95), na.rm=T))
  
})

df <- data.frame(matrix(unlist(result), nrow=length(result), byrow=TRUE))

但我最终得到的 df 似乎只计算了每个 df 的分位数,它没有考虑观察结果:

                    X1               X2             X3
1   0.00000000000031103 0.00000000007249 0.000000001456
2   0.00000000000031103 0.00000000007249 0.000000001456
3   0.00000000000031103 0.00000000007249 0.000000001456

你知道我的分位数代码有什么问题吗? 你认为以另一种更有效的方式来做同样的事情吗? 我会感谢您的反馈。

如果我没猜错的话。也许你正在寻找这个

lst <- split(mtcars, mtcars$vs)
lapply(lst, function(x) t(sapply(x, quantile, probs = c(0.05, 0.5, 0.95), na.rm=T)))
#> $`0`
#>            5%    50%       95%
#> mpg   10.4000  15.65  21.75000
#> cyl    5.7000   8.00   8.00000
#> disp 141.2950 311.00 461.80000
#> hp   107.1500 180.00 274.65000
#> drat   2.9045   3.18   4.25150
#> wt     2.5480   3.57   5.35685
#> qsec  14.5850  17.02  17.98300
#> vs     0.0000   0.00   0.00000
#> am     0.0000   0.00   1.00000
#> gear   3.0000   3.00   5.00000
#> carb   2.0000   4.00   6.30000
#> 
#> $`1`
#>           5%      50%      95%
#> mpg  17.9950  22.8000  32.9250
#> cyl   4.0000   4.0000   6.0000
#> disp 74.0900 120.5500 236.5500
#> hp   58.5000  96.0000 123.0000
#> drat  2.9680   3.9200   4.4685
#> wt    1.5793   2.6225   3.4470
#> qsec 17.8100  19.1700  21.1580
#> vs    1.0000   1.0000   1.0000
#> am    0.0000   0.5000   1.0000
#> gear  3.0000   4.0000   4.3500
#> carb  1.0000   1.5000   4.0000

reprex package (v1.0.0)

于 2021-03-25 创建