按键中的数据表的条件总和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
我该怎么办?
答
这个怎么样?
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"]
在你的问题中包括一个[最小可重现的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)将增加你获得答案的机会。 – jsb
您可以在计算总和后进行合并。 https://stackoverflow.com/questions/18866796/empty-factors-in-by-data-table –
你可以使用'ifelse' – Bulat