因子的矢量:
vec <- factor(c('a','b','b','c','b','c'))
[1] a b b c b c
Levels: a b c
期待一个新的
向量vec_new
[1] 3 1 1 2 1 2
频率较高的那个将被转换为较小的整数。 感谢任何帮助,谢谢
答案 0 :(得分:3)
x2 <- rev(sort(table(x)))
names(x2) <- names(sort(table(x)))
levels(x) <- x2[order(names(x2))]
x
[1] 3 1 1 2 1 2
Levels: 3 1 2
我们首先找到最高频率因子并将rev(sort(table(x)))
的顺序反转(从最小到最大)。接下来,我们将最小到最大的向量重命名,以匹配常规最大到最小频率表的名称。最后,我们现在可以根据名称的顺序分配新级别,同时使用最小到最大的索引。
另一个选项由@RichardScriven提供:
s <- sort(table(x))
x <- factor(vec, labels = rev(s), levels = names(s))
数据强>
vec <- letters[c(1,2,2,3,2,3)]
x <- factor(vec)
[1] a b b c b c
Levels: a b c
答案 1 :(得分:2)
只是投入另一个单行:
as.numeric(reorder(vec, -ave(as.numeric(vec), vec, FUN = length)))
# [1] 3 1 1 2 1 2
首先,您使用ave
计算每个向量级别的(负数 - 以及之后的正确排序)频率,然后使用reorder
重新排序因子级别。后者计算每个级别-ave(.)
的平均值,并按递增顺序相应地调整因子级别(这就是我们使用-ave(.)
的原因)。最后,将因子转换为数字。
答案 2 :(得分:1)
不确定是否有更有效的方法,但您可以了解table(vec)
的不同级别因素的频率,然后您可以使用levels(vec) <- c("b", "c", "a")
手动排序因子的级别