计算方程的累积和

时间:2017-02-21 06:39:07

标签: r

假设我在R中有以下数据框dat

a <- c(6,6,6,7,9,10,11,13,16,17,19,20,22,10,23,25,32,32,34,35,6)
b <- c(1,1,0,1,0,1,0,1,1,0,0,0,1,0,1,0,0,0,0,0,1)
q <- c(3,2,4,2,4,2,2,3,0,5,0,6,1,0,3,4,9,1,2,0,12)

dat <- data.frame(a, b, q)
dat <- dat[order(dat$a),]

对于a的每个级别,我必须计算f = with(dat, sum(q[a==that level]*b[a==that level])/sum(b[a==that level]))。例如,对于a=6f=(3*1+2*1+4*0+12*1)/(3+2+4+12)=17/21

所以我写了如下代码:

dat$qb <- dat$q * dat$b

v1 <- as.numeric(by(dat$qb, dat$a, FUN=sum))
dat$sqb <- rep(v1, table(dat$a))

v2<-as.numeric(by(dat$q, dat$a, FUN=sum))
dat$sumq <- rep(v2, table(dat$a))

dat$f <- dat$sqb/dat$sumq

现在我只需要列af

dat <- unique(dat[,c(1,7)])

我的下一步是计算等式f = with(dat, sum(q[a==that level]*b[a==that level])/sum(b[a==that level]))的累积和:

dat <- replace(dat, is.na(dat), 0)
dat$F <- cumsum(dat$f)

最终,我需要F的最大值[{1}}:

a<=18

这是模拟的一部分,这部分目标是找到Ft <- max(dat$F[dat$a<=18]) 的值。我认为有更快的方法来编写这些代码块。

  • 任何更快的R代码计算Ft <- max(dat$F[dat$a<=18])都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

我们可以使用tidyverse按'a'分组,通过将'b'与'q'相乘来计算'f',得到sum并除以sum' q”。在cumsum NA为0之后,将'F'创建为'f'的replace

library(tidyverse)
dat1 <- dat %>%
          group_by(a) %>% 
          summarise(f = sum(b*q)/sum(q)) %>%
          mutate(F = cumsum(replace(f, is.na(f), 0)))

过滤“a”小于或等于18的行,提取“F”列并获取max

dat1 %>%
     filter(a <= 18) %>%
     .$F %>%
     max
#[1] 3.809524

或另一个选项是data.table

library(data.table)
setDT(dat)[, .(f= sum(b*q)/sum(q)) , a][is.na(f), f := 0
            ][, F := cumsum(f)][a <= 18, max(F)]
#[1] 3.809524