2017-05-20 38 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

相关问题