我有一个包含3列的数据表'df'。身份,餐,时间 每个id都有很多行。
df[meal == 1, sum(time), by = "id"]
现在,我想计算每餐ID = = 1的时间总和。 我目前的代码是:
id V1
1: 1 19
2: 3 7
但是,此代码先执行饭== 1, 所以当一些id没有用餐== 1的记录时,它将被省略而不是返回0.
id 2在此省略。
=!
我该怎么办?
答案 0 :(得分:1)
您可以尝试这样的事情:
df[, is.meal.one := as.integer(meal == 1)]
df[, sum(time * is.meal.one), by = "id"]
答案 1 :(得分: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
请注意,这不是最有效的高效方法,但除非您使用数百万行数据,否则它几乎可以立即运行。