根据" group"更改矢量的编号尺寸

时间:2015-07-31 01:11:13

标签: r

我有一个名为x的整数向量,我想根据"组"更改值。大小,按顺序(从最大到最小)。

这里是dput

c(6, 5, 5, 2, 6, 6, 2, 6, 3, 2, 
4, 2, 4, 6, 1, 2, 6, 5, 2, 4, 
2, 2, 6, 2, 4, 5, 5, 2, 6, 6,
5, 5, 6, 6, 6, 5, 5, 2, 6, 6,
2, 6, 3, 2, 4, 2, 4, 6, 6, 2,
6, 5, 5, 4, 2, 2, 5, 2, 4, 5,
5, 2, 6, 2, 5, 6, 6, 6)

这是table的输出:

> table(x)
x
 1  2  3  4  5  6
 1 20  2  8 15 22

因此6中的x应成为1'(因为6最常出现),{{1} }' S'应成为22应成为5等。

有谁知道这样做的优雅方式?我部分提出了一个涉及3的解决方案,但这非常难看。

编辑:@Richard Scriven的答案适用于我的一些载体,但是当"组的数量和#34; (即唯一整数的数量)变大。这是另一个例子:

as.integer(names(table[rev(order(table))]))

为什么这不起作用的任何想法?

编辑2:似乎有效的解决方案是循环:

> dput(x)
c(8, 1, 2, 8, 15, 15, 8, 15, 3, 8, 13, 8, 15, 15, 4, 8, 5, 13, 
13, 13, 8, 6, 15, 8, 7, 13, 13, 8, 15, 8, 14, 13, 15, 15, 15, 
13, 13, 8, 15, 15, 8, 15, 9, 8, 15, 8, 15, 15, 15, 15, 13, 15, 
13, 10, 8, 11, 13, 8, 12, 13, 13, 8, 15, 8, 14, 15, 16, 15)

> table(x)
x
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
 1  1  1  1  1  1  1 18  1  1  1  1 14  2 22  1 

> tbl <- sort(table(x), decreasing=T)
> tbl
x
15  8 13 14  1  2  3  4  5  6  7  9 10 11 12 16 
22 18 14  2  1  1  1  1  1  1  1  1  1  1  1  1 

> x.new <- as.integer(names(tbl))[x]
> table(x.new)
x.new
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
 1  1  1 18  1  1  1  1  1 14  2 22  1  1  1  1 

3 个答案:

答案 0 :(得分:3)

您可以sort()表格,然后使用表格中的名称和x上的矢量索引。

tbl <- sort(table(x), decreasing = TRUE)
as.integer(names(tbl))[x]  ## or rank(names(tbl))[x]

给出了

#  [1] 1 3 3 2 1 1 2 1 5 2 4 2 4 1 6 2 1 3 2 4 2 2 1 2 4 3 3 2 1 1 3 3
# [33] 1 1 1 3 3 2 1 1 2 1 5 2 4 2 4 1 1 2 1 3 3 4 2 2 3 2 4 3 3 2 1 2
# [65] 3 1 1 1

其中

x <- c(6, 5, 5, 2, 6, 6, 2, 6, 3, 2, 4, 2, 4, 6, 1, 2, 6, 5, 2, 4, 
2, 2, 6, 2, 4, 5, 5, 2, 6, 6, 5, 5, 6, 6, 6, 5, 5, 2, 6, 6, 2, 
6, 3, 2, 4, 2, 4, 6, 6, 2, 6, 5, 5, 4, 2, 2, 5, 2, 4, 5, 5, 2, 
6, 2, 5, 6, 6, 6)

答案 1 :(得分:2)

使用order避免某些转化和拆分的另一个想法:

x2 = match(x, order(table(x), decreasing = TRUE))
table(x)
#x
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
# 1  1  1  1  1  1  1 18  1  1  1  1 14  2 22  1 
table(x2)
#x2
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
#22 18 14  2  1  1  1  1  1  1  1  1  1  1  1  1
x2[x == 14]
#[1] 4 4
x2[x == 8]
# [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

答案 2 :(得分:1)

使用ave

as.integer(as.factor(-ave(x,x,FUN=length)))
# [1] 1 3 3 2 1 1 2 1 5 2 4 2 4 1 6 ....