【问题标题】:Insert a row before each group of data using data.table使用 data.table 在每组数据前插入一行
【发布时间】:2017-08-03 15:05:11
【问题描述】:

这可能是一个愚蠢的问题。但是我想在每组数据之前插入一个角色。我在网上只能找到如何在每个组之后插入一行。此外,插入的行将具有代表每个 ID 的序列号。 例如,我有一个像

这样的数据表
df 
ID     TIME   VAR VALUE
101     07/02   V1     9
101     07/03   V2     NA
101     07/03   V3     10
221     06/01   V1     2
221     07/03   V2     4

我想要类似的东西:

ID     TIME   VAR     VALUE
101       NA   sequence   1
101     07/02   V1        9
101     07/03   V2        NA
101     07/03   V3        10
221       NA   sequence   2
221     06/01   V1        2
221     07/03   V2        4

真实的表有大约 1400 万行和 14000 个唯一 ID。有没有快速更新表格的方法?谢谢!

【问题讨论】:

  • df[, rbind(.(write_your_tuple_here), .SD), by=ID] ?如果不创建新表,则无法更新表以添加/删除行。 stackoverflow.com/q/10790204 在您的情况下,您似乎在宽表上使用了 melt。如果是这样,在熔化之前以该格式添加额外的列可能会更容易。
  • 嗨弗兰克,第一个选项不起作用,或者我可能在里面放了错误的东西(write_your_tuple_here)。对于熔体和额外的柱子,我不确定它是如何下降的。你可以再解释一下吗?谢谢!
  • 嗯,不确定。是不是每个ID都有一行V1,一行V2,一行V3?我的意思是 .(TIME = NA_character_, VAR = "sequence", VALUE = .GRP) 作为您的元组,或者插入行的任何规则。 (.GRP 是序列号,参见?.GRP。)
  • 不,不是每个 ID 都只有一个 V1、V2 和 V3。可能有多个,还有V4,V5...我正在尝试修改元组,还没有成功。但是很高兴知道 .GRP 函数。
  • 好的。 Fwiw,这是rbind 方法有效的示例:DT = data.table(ID= 1:2, v = 3:4, v2 = 5:6); DT[, rbind(.(v = 0, v2 = .GRP), .SD), by=ID]

标签: r data.table


【解决方案1】:

可能会更快,因为它批量执行 rbind:

> tbl[, .SD
      ][, .N, ID
      ][, VALUE := .I
      ][, VAR := 'sequence'
      ][, N := NULL
      ][, rbind(.SD, tbl, fill=T)
      ][order(ID, VAR != 'sequence', TIME)
      ][, .(ID, TIME, VAR, VALUE)
      ]

    ID  TIME      VAR VALUE
1: 101    NA sequence     1
2: 101 07/02       V1     9
3: 101 07/03       V2    NA
4: 101 07/03       V3    10
5: 221    NA sequence     2
6: 221 06/01       V1     2
7: 221 07/03       V2     4
> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2019-03-06
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多