2014-08-28 39 views
0

我之前發佈了一個關於該主題的問題,但我認爲它還不夠清楚。抱歉。所以,這是第二次嘗試。計算值的子集的後續行的總和

我有不同的個人在不同時間的牛奶消耗量(體積)的數據。

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小時內消耗了多少牛奶。例如,在時間0小時(df中的第一行),個人A喝了0.3L牛奶,然後在時間12時喝了額外的0.2L,在時間20時喝了0.1L,這在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) 

「NA」 s爲有,因爲沒有足夠的數據來覆蓋所述牛奶攝入後24小時(該個人的最後一行與給定行之間的時間差小於24小時)。

任何想法,我怎麼能實現這一點?你的答案真的很感激。

+0

您似乎有一個矩陣而不是數據框。另外,這些日期的起源是什麼? – 2014-08-28 17:36:13

+0

@Joanie Van De Walle如果您缺少數值,請不要使用「NA」。將該列轉換爲字符。 – akrun 2014-08-28 17:41:42

+0

同意。在我的情況下,用NA替換0仍然有效,所以我改變了它。 – 2014-08-28 17:44:49

回答

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 
0

如果我得到你的意思,通過識別遵循「長間隔」的行開始:

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

然後

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

應該是你想要的結果

+0

謝謝,但它沒有給出所選行之後24小時內的體積總和。 – 2014-08-28 18:52:35

+0

我明白了一點。嚴格地說,這不能用無插值計算,但我認爲可以修改此代碼來合計足夠的行數超過1.0天。或許,使用'cumsum'重複從'therows'的每個值開始。 – 2014-08-28 19:15:17