如何解决分位数函数通过列表的 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 举报,一经查实,本站将立刻删除。