首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在data.table中订购、分组、变异?

如何在data.table中订购、分组、变异?
EN

Stack Overflow用户
提问于 2021-10-18 08:16:17
回答 1查看 226关注 0票数 1

我是data.table的新手&尝试复制一些dplyr代码,但在变异列时却没有得到相同的结果。

libs

代码语言:javascript
复制
library(data.table)
library(lubridate)
library(tidyverse)

df

代码语言:javascript
复制
test_df <- data.frame(id = c(1234, 1234, 5678, 5678),
           date = c("2021-10-10","2021-10-10", "2021-8-10", "2021-8-15"),
           Amount  = c(54767, 96896, 34534, 79870)) %>% 
  
  mutate(date = ymd(date))

dplyr代码:

代码语言:javascript
复制
test_df %>% 
  group_by(id) %>% 
  arrange(date) %>% 
  mutate(Amt_first = first(Amount),
         Amt_last = last(Amount)) %>%
  ungroup()

结果:

代码语言:javascript
复制
# A tibble: 4 x 5
     id date       Amount Amt_first Amt_last
  <dbl> <date>      <dbl>     <dbl>    <dbl>
1  5678 2021-08-10  34534     34534    79870
2  5678 2021-08-15  79870     34534    79870
3  1234 2021-10-10  54767     54767    96896
4  1234 2021-10-10  96896     54767    96896

data.table尝试(不返回任何内容):

代码语言:javascript
复制
setDT(test_df)[order(date),
             `:=`(Amt_first = data.table::first(Amount),
                   Amt_last = data.table::last(Amount)), 
             by = id]

我不知道出了什么问题,它似乎没有选择任何列,但我作为变异列,所以理想情况下,它应该返回所有的列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-18 08:28:28

这在数据表的FAQ - 2.23中有描述。

您只需要在代码的末尾添加一个额外的[]

代码语言:javascript
复制
setDT(test_df)[order(date),
             `:=`(Amt_first = data.table::first(Amount),
                   Amt_last = data.table::last(Amount)), 
             by = id][]

     id       date Amount Amt_first Amt_last
1: 1234 2021-10-10  54767     54767    96896
2: 1234 2021-10-10  96896     54767    96896
3: 5678 2021-08-10  34534     34534    79870
4: 5678 2021-08-15  79870     34534    79870
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69612772

复制
相关文章

相似问题

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