我之前就该主题发布了一个问题,但我认为还不够明确。抱歉。所以,这是第二次尝试。
我有不同个体在不同时间消耗的牛奶量(体积)的数据。
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小时)
知道如何实现这一目标吗?你的答案非常感谢。
答案 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)]
应该是您想要的结果