计算值子集的后续行的总和

时间:2014-08-28 17:33:05

标签: r

我之前就该主题发布了一个问题,但我认为还不够明确。抱歉。所以,这是第二次尝试。

我有不同个体在不同时间消耗的牛奶量(体积)的数据。

individual <- c(rep("A", 7), rep("B", 6))
time <- c(0, 12, 20, 26, 32, 36, 50, 0, 10, 21, 24, 36, 60)
volume <- c(0.3, 0.2, 0.1, 0.4, 0.3, 0.1, 0.2, 0.2, 0.4, 0.4, 0.3, 0.2, 0.1)
df <- data.frame(individual, time, volume)

所以,我想知道摄入牛奶后24小时内摄入了多少牛奶。例如,个体A在0小时(df的第一行)饮用0.3L牛奶,然后在时间12和0.2L在时间20下饮用0.2L,这使得在24小时期间总共饮用0.6L摄入牛奶后。

我想为每个人的每一行计算这个,所需的输出是:

res_volume <- c(0.6, 1.1, 0.9, 1.0, "NA", "NA", "NA", 1.3, 1.1, 0.9, 0.5, 0.3, "NA")
df2 <- data.frame(df, res_volume)

&#34; NA&#34; s因为没有足够的数据覆盖牛奶摄入后24小时(该个体的最后一行与给定的生产线之间的时间差小于24小时)

知道如何实现这一目标吗?你的答案非常感谢。

2 个答案:

答案 0 :(得分:1)

这个功能对你有用吗?您可以设置任意增量的间隔,默认值为24。

milk_iter_sum <- function(df, interval=24){
  res_volume <- vector()
  df_list <- split(df, f=individual)
  for(i in 1:length(df_list)){
    cur_df <- df_list[[i]]
    for(j in 1:(nrow(cur_df))){

      inner_cur_df <- cur_df[cur_df$time >= cur_df$time[j] & cur_df$time<=cur_df$time[j]+interval,]

      if(cur_df$time[nrow(cur_df)] - inner_cur_df$time[1] < interval){
        res_volume <- append(res_volume, NA)
      }else{
        res_volume <- append(res_volume, with(inner_cur_df, aggregate(volume, by = list(individual), sum))$x)  

      }
    }
  }
  return(cbind(df, res_volume))
}

milk_iter_sum(df)

   individual time volume res_volume
1           A    0    0.3        0.6
2           A   12    0.2        1.1
3           A   20    0.1        0.9
4           A   26    0.4        1.0
5           A   32    0.3         NA
6           A   36    0.1         NA
7           A   50    0.2         NA
8           B    0    0.2        1.3
9           B   10    0.4        1.1
10          B   21    0.4        0.9
11          B   24    0.3        0.5
12          B   36    0.2        0.3
13          B   60    0.1         NA

答案 1 :(得分:0)

如果我理解了你的意思,首先要确定&#34;长间隔&#34;之后的行。 :

therows<- which(df$interval>1)+1

然后

df[therows,c(1,2,4)]

应该是您想要的结果