【问题标题】:How to order, group, mutate in data.table?如何在 data.table 中排序、分组、变异?
【发布时间】:2021-12-05 07:32:25
【问题描述】:

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

library(data.table)
library(lubridate)
library(tidyverse)

df

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 代码:

test_df %>% 
  group_by(id) %>% 
  arrange(date) %>% 
  mutate(Amt_first = first(Amount),
         Amt_last = last(Amount)) %>%
  ungroup()

结果:

# 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 尝试(什么都不给我):

setDT(test_df)[order(date),
             `:=`(Amt_first = data.table::first(Amount),
                   Amt_last = data.table::last(Amount)), 
             by = id]

我不确定出了什么问题,它似乎没有选择任何列,但我正在改变列,所以理想情况下它应该返回所有列。

【问题讨论】:

  • 这个是对的,在by = id]后面加[]强制输出,见FAQ,2.23
  • 感谢@Waldi,它起作用了,如果您可以在答案中添加它,那么我会接受并关闭帖子!

标签: r data.table


【解决方案1】:

这在data.table's FAQ - 2.23中有所描述。
您只需要在代码末尾添加一个额外的[]

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

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2020-04-16
    • 2018-12-14
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2013-03-11
    相关资源
    最近更新 更多