如何通过向量中字符串的权重分配因子水平?
How to assign factor levels by the weight of strings in a vector?
我想根据字符串权重分配因子级别。通常 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
由 reprex package (v0.2.0) 创建于 2018-03-16。
我想根据字符串权重分配因子级别。通常 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
由 reprex package (v0.2.0) 创建于 2018-03-16。