计算大数据帧 R 中 20 组的分位数
Calculating quantiles in groups of 20 in large data frame R
我正在尝试为一个非常大的数据集(超过 40,000 行)计算每组 20 行的分位数。我还希望将结果写入一个 .csv 文件。
我可以使用这样的切片符号来计算我需要的内容:
my_data<-read.csv(file.choose(),header=TRUE)
q1<-my_data[1:20,"Q"]
q2<-my_data[21:40,"Q"]
quant1<-quantile(q1,c(0.5,0.75,0.8,0.9,0.95))
quant2<-quantile(q2,c(0.5,0.75,0.8,0.9,0.95))
d=data.frame(quant1,quant2)
write.csv(d,file="q_values.csv")
然而,为整个数据集重写这些行将变得极其麻烦和耗时。我想以某种方式遍历数据,以便它计算每 20 行我需要的内容,但我似乎无法理解如何执行此操作。我已经阅读了 R 中 "for" 循环的帮助文件,但在编码方面我仍处于新手水平,非常感谢有关如何执行此操作的一些指导。谢谢
如果您添加一个列作为索引依据,您可以很容易地做到这一点。这是一个使用 data.table.
的例子
dat <- data.table(Q = rnorm(40000))
dat[, R := rep(1:(.N/20), each = 20)]
dat[, .(quant_0.5 = quantile(Q, probs = c(0.5)),
quant_0.75 = quantile(Q, probs = c(0.75)),
quant_0.8 = quantile(Q, probs = c(0.8)),
quant_0.9 = quantile(Q, probs = c(0.9)),
quant_0.95 = quantile(Q, probs = c(0.95))),
by = R]
给出结果:
R quant_0.5 quant_0.75 quant_0.8 quant_0.9 quant_0.95
1: 1 -0.123822327 0.4609870 0.5784939 1.0898441 1.1224632
2: 2 -0.251293742 0.3701377 0.7802016 1.0747215 1.5514140
3: 3 -0.070979910 0.4268033 0.5546480 1.4477840 1.5304469
4: 4 0.177552739 0.8687846 1.0001809 1.3883132 1.5394739
5: 5 0.515836825 0.9611607 1.1268148 1.3396512 1.5087827
---
1996: 1996 0.566311407 1.0667204 1.3171846 1.5641837 1.8594775
1997: 1997 0.009336622 0.2859035 0.3397875 0.5472635 0.8108932
1998: 1998 0.514867828 1.0330679 1.0534716 1.2528384 2.0933062
1999: 1999 0.247092220 0.7501609 0.8924200 1.1446394 1.4736887
2000: 2000 -0.076496868 0.6816951 0.7430764 0.8362260 1.1001702
我正在尝试为一个非常大的数据集(超过 40,000 行)计算每组 20 行的分位数。我还希望将结果写入一个 .csv 文件。
我可以使用这样的切片符号来计算我需要的内容:
my_data<-read.csv(file.choose(),header=TRUE)
q1<-my_data[1:20,"Q"]
q2<-my_data[21:40,"Q"]
quant1<-quantile(q1,c(0.5,0.75,0.8,0.9,0.95))
quant2<-quantile(q2,c(0.5,0.75,0.8,0.9,0.95))
d=data.frame(quant1,quant2)
write.csv(d,file="q_values.csv")
然而,为整个数据集重写这些行将变得极其麻烦和耗时。我想以某种方式遍历数据,以便它计算每 20 行我需要的内容,但我似乎无法理解如何执行此操作。我已经阅读了 R 中 "for" 循环的帮助文件,但在编码方面我仍处于新手水平,非常感谢有关如何执行此操作的一些指导。谢谢
如果您添加一个列作为索引依据,您可以很容易地做到这一点。这是一个使用 data.table.
的例子dat <- data.table(Q = rnorm(40000))
dat[, R := rep(1:(.N/20), each = 20)]
dat[, .(quant_0.5 = quantile(Q, probs = c(0.5)),
quant_0.75 = quantile(Q, probs = c(0.75)),
quant_0.8 = quantile(Q, probs = c(0.8)),
quant_0.9 = quantile(Q, probs = c(0.9)),
quant_0.95 = quantile(Q, probs = c(0.95))),
by = R]
给出结果:
R quant_0.5 quant_0.75 quant_0.8 quant_0.9 quant_0.95
1: 1 -0.123822327 0.4609870 0.5784939 1.0898441 1.1224632
2: 2 -0.251293742 0.3701377 0.7802016 1.0747215 1.5514140
3: 3 -0.070979910 0.4268033 0.5546480 1.4477840 1.5304469
4: 4 0.177552739 0.8687846 1.0001809 1.3883132 1.5394739
5: 5 0.515836825 0.9611607 1.1268148 1.3396512 1.5087827
---
1996: 1996 0.566311407 1.0667204 1.3171846 1.5641837 1.8594775
1997: 1997 0.009336622 0.2859035 0.3397875 0.5472635 0.8108932
1998: 1998 0.514867828 1.0330679 1.0534716 1.2528384 2.0933062
1999: 1999 0.247092220 0.7501609 0.8924200 1.1446394 1.4736887
2000: 2000 -0.076496868 0.6816951 0.7430764 0.8362260 1.1001702