2017-10-13 108 views
0

我有一個有3列的數據表'df'。 ID,用餐,時間 每個ID有很多行。按鍵中的數據表的條件總和R

library(data.table) 
id = c(1,1,2,2,3,3) 
meal = c(1,1,0,0,1,0) 
time = c(10,9,12,13,7,15) 
df <- data.table(id, meal, time) 

> df 
    id meal time 
1: 1 1 10 
2: 1 1 9 
3: 2 0 12 
4: 2 0 13 
5: 3 1 7 
6: 3 0 15 

現在,我想計算每個ID的用餐== 1時的總和。 我當前的代碼是:

df[meal == 1, sum(time), by = "id"]

但是,此代碼EXCUTE餐== 1首先, 所以當一些ID與餐== 1沒有記錄,它會被忽略,而不是返回0

此處省略了id 2。

id V1 
1: 1 19 
2: 3 7 

我該怎麼辦?

+2

在你的問題中包括一個[最小可重現的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)將增加你獲得答案的機會。 – jsb

+0

您可以在計算總和後進行合併。 https://stackoverflow.com/questions/18866796/empty-factors-in-by-data-table –

+0

你可以使用'ifelse' – Bulat

回答

0

這個怎麼樣?

library(data.table) 

dt <- data.table(
    id = c(1, 1, 2, 2, 3, 3), 
    meal = c(1, 5, 3, 2, 10, 1), 
    time = c(2, 10, 15, 5, 5, 2) 
) 

    id meal time 
1: 1 1 2 
2: 1 5 10 
3: 2 3 15 
4: 2 2 5 
5: 3 10 5 
6: 3 1 2 

dt[, list(Meal1Time = sum(time[which(meal == 1)])), by=id] 
    id Meal1Time 
1: 1   2 
2: 2   0 
3: 3   2 

注意,這不是最有效的方法,但除非你與數百萬行數據的工作,應該幾乎瞬間運行。

+0

請不要忘記標記解決方案爲「正確的」,如果它是你想要的。 – Ben

1

你可以嘗試這樣的事情:

df[, is.meal.one := as.integer(meal == 1)] 
df[, sum(time * is.meal.one), by = "id"]