r语言 - 如何按向量中字符串的权重分配因子水平



我想根据字符串权重分配因子水平。通常,R 似乎按字母顺序分配因子水平:

set.seed(54)
x <- sample(1:10, 5000, replace = TRUE)
x <- "levels<-"(as.factor(x), LETTERS[1:10])
> summary(x)
  A   B   C   D   E   F   G   H   I   J 
524 508 519 489 477 496 507 526 473 481 

我可以对因子水平重新排序并像这样重新分配它们:

l <- data.frame(x=summary(x), old.levels=names(summary(x)), 
                        row.names = NULL)
l <- transform(l[order(summary(x)), ],
               new.levels=LETTERS[1:10])
levels(x) <- l[order(l$old.levels), 3]
> summary(x)
  I   G   H   D   B   E   F   J   A   C 
524 508 519 489 477 496 507 526 473 481 

但是通过这个,我没有更改因子值:

> summary(as.factor(as.numeric(x)))
  1   2   3   4   5   6   7   8   9  10 
524 508 519 489 477 496 507 526 473 481 

怎样才能聪明地得到我想要的东西?

factor的默认行为实际上是对级别进行排序,然后分配标签。

set.seed(54)
x <- sample(letters[1:10], 5000, replace = TRUE)
f1 <- factor(x, labels = LETTERS[1:10])
f2 <- factor(x, levels = sort(unique(x)), LETTERS[1:10])
summary(f1)
#>   A   B   C   D   E   F   G   H   I   J 
#> 524 508 519 489 477 496 507 526 473 481
identical(f1, f2)
#> [1] TRUE

如果您只想按频率顺序分配标签,则可以通过以下方式执行此操作在创建因子时对标签重新排序:

f3 <- factor(x, levels = sort(unique(x)), LETTERS[1:10][order(table(x))])
summary(f3)
#>   I   E   J   D   F   G   B   C   A   H 
#> 524 508 519 489 477 496 507 526 473 481

如果您希望按频率顺序排列标签,并按字母顺序对水平进行排序,请改为在因子创建期间对水平进行排序:

f4 <- factor(x, levels = sort(unique(x))[order(table(x))], LETTERS[1:10])
summary(f4)
#>   A   B   C   D   E   F   G   H   I   J 
#> 473 477 481 489 496 507 508 519 524 526

创建于 2018-03-16 由 reprex 包 (v0.2.0(.

最新更新