【问题标题】:Add missing rows to data.table将缺失的行添加到 data.table
【发布时间】:2018-06-19 19:45:13
【问题描述】:

假设我的值选项是 1 到 9。 我有以下data.table:

> group = c(1,1,1,2,2,2,2,3,3,3,3,4,4)
> value = c(2,3,4,5,6,7,8,2,4,6,7,4,9)
> a=data.table(group=group,value=value)
> a
    group value
 1:     1     2
 2:     1     3
 3:     1     4
 4:     2     5
 5:     2     6
 6:     2     7
 7:     2     8
 8:     3     2
 9:     3     4
10:     3     6
11:     3     7
12:     4     4
13:     4     9

现在,对于每个组,我想添加缺失的行。 IE。对于第 1 组,我错过了值 1 和 5-9。但是,如果我用 CJ 来做:

> b=a[CJ(group=group,value=value,unique=TRUE),on=.(group,value)]
> b
    group value
 1:     1     2
 2:     1     3
 3:     1     4
 4:     1     5
 5:     1     6
 6:     1     7
 7:     1     8
 8:     1     9
 9:     2     2
10:     2     3
11:     2     4
12:     2     5
13:     2     6
14:     2     7
15:     2     8
16:     2     9
17:     3     2
18:     3     3
19:     3     4
20:     3     5
21:     3     6
22:     3     7
23:     3     8
24:     3     9
25:     4     2
26:     4     3
27:     4     4
28:     4     5
29:     4     6
30:     4     7
31:     4     8
32:     4     9
    group value

我错过了值 1。因为它根本不在此数据表中。但我仍然认为它是我的选择之一。我怎样才能做到这一点?

【问题讨论】:

  • CJ(group = a[, unique(group)], value = seq_len(a[, max(value)]))
  • 太棒了!我的原始 data.table 中也有更多列,我想保留这些列,并为新生成的行插入 NA。这种方法也可以吗?
  • 只需在您的CJ() 中使用value = seq_len(max(value)) 而不是value

标签: r join data.table cross-join


【解决方案1】:

正如@Roland 的评论中指出的那样,使用:

代替CJ() 中的value = value
value = seq_len(max(value))

或者在value 列中指定您想要的范围。

因此,您只需将您的尝试修改为:

b = a[CJ(group = group, value = value, unique = TRUE), on = .(group,value)]

成为:

b = a[CJ(group = group, value = seq_len(max(value)), unique = TRUE),
      on = .(group,value)]

【讨论】:

  • 完美运行。这是我自己没有想到的!谢谢
猜你喜欢
  • 2015-05-29
  • 2015-02-06
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多