按键中的数据表的条件总和R

问题描述:

我有一个有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

这个怎么样?

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

你可以尝试这样的事情:

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