我有以下问题,这可能有一个非常简单的解决方案:当我使用
library (data.table)
actions = data.table(User_id = c("Carl","Carl","Carl","Lisa","Moe"),
category = c(1,1,2,2,1),
value= c(10,20,30,40,50))
User_id category value
1: Carl 1 10
2: Carl 1 20
3: Carl 2 30
4: Lisa 2 40
5: Moe 1 50
actions[category==1,sum(value),by= User_id]问题是,它首先排序类别为1的行,然后使用by命令。所以我得到的是:
User_id V1
1: Carl 30
2: Moe 50但我想要的是
User_id V1
1: Carl 30
2: Lisa 0
3: Moe 50我正在构建一个只包含用户信息的data.table,因此:
users = actions[,User_id,by= User_id]
users$value_one = actions[category==1,.(value_one =sum(value)),by= User_id]$value_one如果有些用户没有条目,则抛出错误或包含错误的值。
发布于 2016-05-18 15:34:48
这几乎是简洁的,并完成了工作。
actions[, .SD[category==1, sum(value)], by=User_id]
# User_id V1
# 1: Carl 30
# 2: Lisa 0
# 3: Moe 50
## Or, better yet, no need to muck around with .SD, (h.t. David Arenburg)
actions[, sum(value[category == 1]), by = User_id]
# User_id V1
# 1: Carl 30
# 2: Lisa 0
# 3: Moe 50如果上面的相对低效率是用例中的一个问题,下面是一个更有效的替代方案:
res <- actions[, .(val=0), by=User_id]
res[actions[category==1, .(val=sum(value)), by=User_id], val:=i.val, on="User_id"]
res
# User_id val
# 1: Carl 30
# 2: Lisa 0
# 3: Moe 50https://stackoverflow.com/questions/37303866
复制相似问题