我有一个名为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'应成为2
,2
应成为5
等。
有谁知道这样做的优雅方式?我部分提出了一个涉及3
的解决方案,但这非常难看。
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
答案 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 ....