微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分位数函数通过列表的 dfs

如何解决分位数函数通过列表的 dfs

我有一个包含 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 年 3 月 25 日创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。