2017-05-20 36 views
2

有沒有函數可以反轉的數值 data.table,中的值,而不是按頻率排序?例如。說我有這樣的:是否有一個函數來反轉data.table中值的出現次數?

install.packages('data.table') 
require(data.table) 

initially = data.table(initially = c('a,a','b,b','b,b','c,c','c,c','c,c')) 
View(initially) 

,並希望產生這樣的:

required.inversion = data.table(required.inversion = c('a,a','a,a','a,a','b,b','b,b', 'c,c')) 
View(required.inversion) 

我想這樣做的方式是產生一個頻率表:

initial.frequencies = initially[, .N ,by = initially] 
View(initial.frequencies) 

它排序到確保它在上升次序:

initial.frequencies = initial.frequencies[,.SD[order(N)]] 
View(initial.frequencies) 

存儲那些初始值的順序:

inversion.key = initial.frequencies$initially 
View(inversion.key) 

重新排序data.table因此它在降序頻率順序:

initial.frequencies = initial.frequencies[,.SD[order(N, decreasing = TRUE)]] 
View(initial.frequencies) 

然後插入原始訂單回表:

initial.frequencies$inversion.key = inversion.key 
View(initial.frequencies) 

我現在有一個'鑰匙'顯示我有多少ti mes初始值將需要相乘以反轉它發生的次數。即我需要將'a','a'出現3次,'b,b'出現2次,'c,c'出現1次。

我不知道如何實際複製原始表中的值,這似乎是一種不好的方法,因爲它也會使表的長度加倍。

this.approach.would.yield.this.in.the.ram = data.table(this.approach.would.yield.this.in.the.ram = c('a,a','b,b','b,b','c,c','c,c','c,c', 'a,a','a,a','a,a','b,b','b,b', 'c,c')) 
View(this.approach.would.yield.this.in.the.ram) 
+1

'RLE()',然後反向( 'rev()')結果中的$長度。 – jogo

+0

剛纔提到的,'rle'方法還假定初始數據已經按出現次序排序。 – mt1022

回答

2

如果我們通過OP使用的方法,則只需通過的 'N' 反向複製的行和分配 'N' 爲NULL

initially[, .N, by = initially][rep(seq_len(.N), rev(N))][, N := NULL][] 
+1

感謝大家的快速回復,太棒了! – bg49ag

相關問題