通过列表的 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 创建
我有一个包含 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 创建