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

如何在data.table中链序、分组、变异、支点?
EN

Stack Overflow用户
提问于 2021-10-18 15:44:36
回答 2查看 114关注 0票数 0

我是 data.table 的新手&我试图复制一些dplyr代码,但在data.table代码中存在支点/重塑数据的问题。

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() %>%

  pivot_longer(cols = c(Amt_first:Amt_last), names_to = "Amt_catg", 
  values_to = "Amt_val")

结果:

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

data.table尝试

代码语言:javascript
复制
setDT(test_df)[order(date),
             `:=`(Amt_first = data.table::first(Amount),
                   Amt_last = data.table::last(Amount)), 
             by = id] %>% 
    
    # https://cran.r-project.org/web/packages/data.table/vignettes/datatable-reshape.html
  data.table::melt(measure.vars = c("Amt_first","Amt_Last"),
                   variable.name = "Amt_catg", value.name = "Amt_val")

我这里有个错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-18 16:00:43

您会得到一个错误,因为您拼写错了Amt_last

代码语言:javascript
复制
setDT(test_df)[order(date),
                 `:=`(Amt_first = data.table::first(Amount),
                      Amt_last = data.table::last(Amount)), 
                 by = id] %>%
  data.table::melt(id.vars=c('id','date'),measure.vars = c("Amt_first","Amt_last"),
                   variable.name = "Amt_catg", value.name = "Amt_val")

     id       date Amount  Amt_catg Amt_val
1: 1234 2021-10-10  54767 Amt_first   54767
2: 1234 2021-10-10  96896 Amt_first   54767
3: 5678 2021-08-10  34534 Amt_first   34534
4: 5678 2021-08-15  79870 Amt_first   34534
5: 1234 2021-10-10  54767  Amt_last   96896
6: 1234 2021-10-10  96896  Amt_last   96896
7: 5678 2021-08-10  34534  Amt_last   79870
8: 5678 2021-08-15  79870  Amt_last   79870
票数 0
EN

Stack Overflow用户

发布于 2021-10-18 16:08:02

输出可以通过完全连接来实现:

代码语言:javascript
复制
setDT(test_df)

merge(
  test_df,
  test_df[order(date), 
          .(Amt_catg = c('Amt_first', 'Amt_last'), 
            Amt_val = Amount[c(1L, .N)]), 
          by = id]
)

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

https://stackoverflow.com/questions/69618955

复制
相关文章

相似问题

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