data.table按组分配矢量

时间:2017-02-27 18:12:11

标签: r data.table

假设我们有以下data.table

dt = data.table(a=letters[1:20], b = c(rep(1,3),rep(2,7),rep(3,5),rep(4,5)))

    a b
 1: a 1
 2: b 1
 3: c 1
 4: d 2
 5: e 2
 6: f 2
 7: g 2
 8: h 2
 9: i 2
10: j 2
11: k 3
12: l 3
13: m 3
14: n 3
15: o 3
16: p 4
17: q 4
18: r 4
19: s 4
20: t 4

并且我想为每一行指定从0到1的等级,但是按列b进行分组。我在做

dt[,len:=.N,by=b][,rank:=c(0:(len-1))/(len-1),by=b][,len:=NULL]

其中len只是计算排名然后被删除。我获得了

    a b      rank
 1: a 1 0.0000000
 2: b 1 0.5000000
 3: c 1 1.0000000
 4: d 2 0.0000000
 5: e 2 0.1666667
 6: f 2 0.3333333
 7: g 2 0.5000000
 8: h 2 0.6666667
 9: i 2 0.8333333
10: j 2 1.0000000
11: k 3 0.0000000
12: l 3 0.2500000
13: m 3 0.5000000
14: n 3 0.7500000
15: o 3 1.0000000
16: p 4 0.0000000
17: q 4 0.2500000
18: r 4 0.5000000
19: s 4 0.7500000
20: t 4 1.0000000

这正是我想要的。问题是我也得到了这个

   Warning messages:
 1: In base::":"(from, to) :
  numerical expression has 3 elements: only the first used
 2: In base::":"(from, to) :
  numerical expression has 7 elements: only the first used
 3: In base::":"(from, to) :
  numerical expression has 5 elements: only the first used
 4: In base::":"(from, to) :
  numerical expression has 5 elements: only the first used

我想忽略它们,当数据很小时我就可以了,我可以通过视线检查结果。但由于我的data.table有数千行,我想确保这些警告实际上是无害的。

你怎么看? 或者,等价地,我的方法是通过在data.table中分组来分配“向量”吗?还有其他选择吗?

谢谢

1 个答案:

答案 0 :(得分:2)

您将从代码的这一部分收到警告:0:(len-1):的第二个参数len-1是长度为.N的向量,但:需要长度为1的向量。您可以使用(1:2):(2:3)重新创建警告或者使用seq_len(2):seq_len(2)

以下将在没有警告的情况下在一行中计算您想要的内容:

dt[, rank := (seq_len(.N) - 1) / (.N - 1), by=b]
dt
    a b      rank
 1: a 1 0.0000000
 2: b 1 0.5000000
 3: c 1 1.0000000
 4: d 2 0.0000000
 5: e 2 0.1666667
 6: f 2 0.3333333
 7: g 2 0.5000000
 8: h 2 0.6666667
 9: i 2 0.8333333
10: j 2 1.0000000
11: k 3 0.0000000
12: l 3 0.2500000
13: m 3 0.5000000
14: n 3 0.7500000
15: o 3 1.0000000
16: p 4 0.0000000
17: q 4 0.2500000
18: r 4 0.5000000
19: s 4 0.7500000
20: t 4 1.0000000