【问题标题】:Calculating quantiles in groups of 20 in large data frame R在大数据框 R 中以 20 个为一组计算分位数
【发布时间】:2017-06-27 21:05:27
【问题描述】:

我正在尝试为一个非常大的数据集(超过 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”循环的帮助文件,但在编码方面我仍然处于新手级别,非常感谢有关如何执行此操作的一些指导。谢谢

【问题讨论】:

    标签: r iteration quantile


    【解决方案1】:

    如果您添加一列作为索引依据,您可以很容易地做到这一点。这是一个使用 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
    

    【讨论】:

    • 谢谢埃里克!!我以前从未听说过 data.table,结果很好!虽然我首先必须使用 as.data.table 将我的数据框转换为数据表。我也被卡住了,因为我的数据文件中有几个我没有意识到的 nan,所以我必须在脚本运行之前解决这些问题。谢谢!
    • 很高兴我能帮上忙。有很多方法可以做到这一点,我只是默认使用 data.table,因为我经常使用它而不是 data.frames。特别是,包 dplyr 将使用 data.frames 给出与上述类似的结果,但语法非常不同。无论哪种方式,让列作为索引是有帮助的。如果您喜欢 data.table,请尝试使用函数 freadmy_data &lt;- fread(file.choose()) 它会读入你的 csv,通常比 read.csv 快很多,并且一次性创建 data.table。
    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多