【问题标题】:Give order number by group按组给出订单号
【发布时间】:2019-01-31 02:00:51
【问题描述】:

我知道data.table 包包含一个参数.GRP,用于按组提供订单号。但是,如果我不希望订单号从 1 开始,怎么办?

# dt
YEAR   NAME   ST
2010   AAA    AK
2011   AAA    AK
2012   AAA    AK
2010   BBB    AL
2011   BBB    AL
2010   CCC    CA

dt[, ID := .GRP, .(NAME, ST)]

YEAR   NAME   ST    ID
2010   AAA    AK     1 
2011   AAA    AK     1
2012   AAA    AK     1
2010   BBB    AL     2
2011   BBB    AL     2
2010   CCC    CA     3

现在,我清楚地解释我的问题。
如果我在其中添加许多新的观察结果。如何添加之前的ID 号码。

YEAR   NAME   ST    ID
2010   AAA    AK     1 
2011   AAA    AK     1
2012   AAA    AK     1
2010   BBB    AL     2
2011   BBB    AL     2
2010   CCC    CA     3
2010   DDD    LA     
2011   DDD    LA    
2015   DDD    LA    
2016   DDD    LA    
2010   EEE    GA    
2011   EEE    GA    
2014   FFF    PA     


YEAR   NAME   ST    ID
2010   AAA    AK     1 
2011   AAA    AK     1
2012   AAA    AK     1
2010   BBB    AL     2
2011   BBB    AL     2
2010   CCC    CA     3
2010   DDD    LA     4
2011   DDD    LA     4
2015   DDD    LA     4
2016   DDD    LA     4
2010   EEE    GA     5
2011   EEE    GA     5
2014   FFF    PA     6

【问题讨论】:

  • 您可以在添加新数据后再次致电dt[, ID := .GRP, .(NAME, ST)] 吗?
  • 数据很多,需要保持原来的数量。如果我重新调用它,数字也可能会改变。

标签: r data.table data-manipulation


【解决方案1】:

我的想法是保留对已分配的最大 ID 值的引用,然后使用它来添加到新的 .GRP 值。这是一个例子

设置数据

library(data.table)

dt <- fread('YEAR   NAME   ST
2010   AAA    AK
2011   AAA    AK
2012   AAA    AK
2010   BBB    AL
2011   BBB    AL
2010   CCC    CA')

## Assign GRP IDs
dt[, ID := .GRP, .(NAME, ST)]

## New data
dt1 <- fread('YEAR   NAME   ST
2010   AAA    AK
2011   AAA    AK
2012   AAA    AK
2010   BBB    AL
2011   BBB    AL
2010   CCC    CA
2010   DDD    LA
2011   DDD    LA
2015   DDD    LA
2016   DDD    LA
2010   EEE    GA
2011   EEE    GA
2014   FFF    PA ')

现在我们有两个 data.table,一个是原始的 dt,一个是新的 dt1。我们可以将它们连接在一起,将原始 ID 值放入dt1

## Attach the original ID values
dt1[
  dt
  , on = c("YEAR", "NAME", "ST")
  , ID := ID
]

更新 ID 值

然后我们可以在这个ID值为NA的新数据上应用相同的[ID := .GRP, .(NAME, ST)],并从原始数据中添加最大ID

## set the order so the NAs are at the bottom 
setorder(dt1, ST, NAME, YEAR, ID)

## keep a reference to the maximum Id already assigned, then add it to tne new groups
maxId <- max(dt1$ID, na.rm = T)
dt1[is.na(ID), ID := .GRP + maxId, .(NAME, ST) ]

dt1
#     YEAR NAME ST ID
# 1:  2010  AAA AK  1
# 2:  2011  AAA AK  1
# 3:  2012  AAA AK  1
# 4:  2010  BBB AL  2
# 5:  2011  BBB AL  2
# 6:  2010  CCC CA  3
# 7:  2010  EEE GA  4
# 8:  2011  EEE GA  4
# 9:  2010  DDD LA  5
# 10: 2011  DDD LA  5
# 11: 2015  DDD LA  5
# 12: 2016  DDD LA  5
# 13: 2014  FFF PA  6

【讨论】:

  • 另外,dt1[, new_id := if (is.na(first(ID))) .GRP else ID, by=.(NAME, ST)],我想。哦,没关系,看到 OP 模糊的“数字也可能改变”的条件。
  • @Frank 是的,我怀疑如果/当 OP 改进他们的要求时,这个答案将不得不改变
  • 回答和评论有什么区别?我很困惑。
  • 答案会保留原来的ID 值,添加新数据时不会覆盖它们
猜你喜欢
  • 1970-01-01
  • 2016-08-31
  • 2020-12-12
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多