2017-02-27 63 views
0

分配矢量比方說,我們有以下data.tabledata.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中進行分組來允許分配「向量」?有替代品嗎?

謝謝

回答

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 
+0

@Imo謝謝!好的解決方案所以你確認一個人可以通過引用分配一個完整的向量組? – deltasun

+1

是的。這是上面的代碼所做的。您也可以使用i參數來按組指派或替換矢量的子集。 – lmo