首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >data.table,在此之前

data.table,在此之前
EN

Stack Overflow用户
提问于 2016-05-18 15:20:59
回答 1查看 129关注 0票数 10

我有以下问题,这可能有一个非常简单的解决方案:当我使用

代码语言:javascript
复制
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命令。所以我得到的是:

代码语言:javascript
复制
   User_id V1
1:    Carl 30
2:     Moe 50

但我想要的是

代码语言:javascript
复制
   User_id V1
1:    Carl 30
2:    Lisa 0
3:     Moe 50

我正在构建一个只包含用户信息的data.table,因此:

代码语言:javascript
复制
users = actions[,User_id,by= User_id]
users$value_one = actions[category==1,.(value_one =sum(value)),by= User_id]$value_one

如果有些用户没有条目,则抛出错误或包含错误的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-18 15:34:48

这几乎是简洁的,并完成了工作。

代码语言:javascript
复制
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

如果上面的相对低效率是用例中的一个问题,下面是一个更有效的替代方案:

代码语言:javascript
复制
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  50
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37303866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档