在data.table中是否有一个函数可以反转值出现的次数?

3
有没有一种函数可以翻转数据表中某个值的出现次数,而不是按频率排序呢?例如,我有这样一个数据表:
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)

And wish to produce this:

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)

重新排序数据表,使其按降序频率排列:
initial.frequencies = initial.frequencies[,.SD[order(N, decreasing = TRUE)]]
View(initial.frequencies)

然后将原始订单重新插入到表中:
 initial.frequencies$inversion.key = inversion.key
 View(initial.frequencies)

我现在有一个“键”,显示我需要将初始值乘以多少次才能翻转它出现的次数。例如,“a,a”出现的次数需要乘以三,“b,b”需要乘以两次,“c,c”需要乘以一次。
我不确定如何实际复制原始表中的值,这似乎是一个不好的方法,因为它会使表的长度加倍。
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()),并翻转其中的 $lengths。 - jogo
只是提一下,rle方法还假定初始数据已经按出现次数排序。 - mt1022
1个回答

2

如果我们采用原始问题的方法,就可以通过将“N”的逆序行复制并将“N”赋值为NULL来完成。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接