gpt4 book ai didi

r - 根据 "group"大小更改矢量的编号

转载 作者:行者123 更新时间:2023-12-04 11:12:57 25 4
gpt4 key购买 nike

我有一个名为 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(x)
x
1 2 3 4 5 6
1 20 2 8 15 22

所以x中的6应该变成1(因为6出现的次数最多) ,2'应该变成25应该变成3,等等。

有谁知道一个优雅的方法来做到这一点?我部分地想出了一个涉及 as.integer(names(table[rev(order(table))])) 的解决方案,但这非常难看。


编辑:@Richard Scriven 的回答对我的一些向量有效,但是当“组”的数量(即唯一整数的数量)变大时会发生一些奇怪的事情。这是另一个例子:

> 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

知道为什么这行不通吗?


编辑 2:似乎可行的解决方案是循环:

for (i in seq_along(tbl)) {
x.new[which(x == as.integer(names(tbl))[i])] <- i
}

最佳答案

您可以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)

关于r - 根据 "group"大小更改矢量的编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com