【问题标题】:Calculate top % of variable according to condition根据条件计算变量的前 %
【发布时间】:2016-02-25 09:10:38
【问题描述】:

数据样本的结构如下:

Individ <- data.frame(Participant = c("Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", 
                                      "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry", "Harry"),
                      Time = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12),
                      Power = c(400, 250, 180, 500, 300, 450, 600, 512, 300, 500, 450, 200, 402, 210, 130, 520, 310, 451, 608, 582, 390, 570, NA, NA))

我计算了两秒、三秒和四秒内Power 的滚动平均值。我知道我可以通过执行以下操作对每个滚动平均值进行子集化(考虑到 Participant 的变化):

Individ$TwoSec <- ave(Individ$Power, Individ$Participant, 
                          FUN= function(x) rollapply(x, 2, mean, na.rm = TRUE, fill = NA) )
Individ$ThreeSec <- ave(Individ$Power, Individ$Participant, 
                          FUN= function(x) rollapply(x, 3, mean, na.rm = TRUE, fill = NA) )
Individ$FourSec <- ave(Individ$Power, Individ$Participant, 
                            FUN= function(x) rollapply(x, 4, mean, na.rm = TRUE, fill = NA) )

我现在希望找到每个滚动平均值(TwoSecThreeSecFourSec)的前 5% 的 Power。我该怎么做才能考虑到Name 的变化并计算这个?

我的实际 data.frame 是 > 300 万行,因此首选快速解决方案。

【问题讨论】:

    标签: r subset


    【解决方案1】:

    我们可以试试

    library(data.table)
    library(RcppRoll)
    setDT(Individ)[, lapply(2:4, function(n) {
          r1 <- roll_mean(Power, n, fill=NA)
          r2 <- r1[order(-r1)]
          r2[seq(ceiling(.N*0.05))]}) ,  by = Participant]
    

    【讨论】:

    • 感谢data.table 提高容量的解决方案。
    • 这也包括 Power 的滚动平均值。我已经计算过了,好吧,我只想遍历每个滚动平均列(例如,Individ$TwoSec、Individu$ThreeSec)以找到每个参与者中的前 5%。您能否编辑或添加一个省略滚动平均功能的答案?
    • @user2716568 你能把它作为一个新问题发布吗?
    • 是的,我当然可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多