R中键的数据表的条件和

时间:2017-10-13 22:29:54

标签: r sum data.table

我有一个包含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在此省略。

=!

我该怎么办?

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

请注意,这不是最有效的高效方法,但除非您使用数百万行数据,否则它几乎可以立即运行。