根据另一个因子重新排序因子水平

标签 r

我有一个数据框 data如下。

data <- structure(list(fac1 = structure(c(6L, 16L, 4L, 14L, 1L, 7L, 3L, 
                                          2L, 15L, 10L, 11L, 9L, 8L, 5L, 13L, 12L), .Label = c("dd85", 
                                                                                               "ee01", "ee12", "ee78", "gs85", "jj45", "jj63", "qe89", "qq74", 
                                                                                               "tt23", "tt78", "vd41", "vd51", "ww77", "yy25", "yy85"), class = "factor"), 
                       fac2 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
                                          3L, 3L, 4L, 4L, 4L, 4L), .Label = c("md", "av", "zr", "kj"), class = "factor")), .Names = c("fac1", 
                                                                                                                                  "fac2"), row.names = c(NA, 16L), class = "data.frame")


levels(data$fac1)
levels(data$fac2)

data
   fac1 fac2
1  jj45   md
2  yy85   md
3  ee78   md
4  ww77   md
5  dd85   av
6  jj63   av
7  ee12   av
8  ee01   av
9  yy25   zr
10 tt23   zr
11 tt78   zr
12 qq74   zr
13 qe89   kj
14 gs85   kj
15 vd51   kj
16 vd41   kj

levels(data$fac1)
 [1] "dd85" "ee01" "ee12" "ee78" "gs85" "jj45" "jj63" "qe89" "qq74" "tt23" "tt78" "vd41" "vd51" "ww77" "yy25" "yy85"

levels(data$fac2)
[1] "md" "av" "zr" "kj"

如何重新排序 fac1 的级别基于fac2 ?

我试过 factor(data, levels=data[order(data$fac2),], ordered=TRUE)根据这个question ,但它给出了两个级别。
factor(data, levels=data[order(data$fac2),], ordered=TRUE)
                                                    fac1                                                     fac2 
c(6, 16, 4, 14, 1, 7, 3, 2, 15, 10, 11, 9, 8, 5, 13, 12)        c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4) 
2 Levels: c(6, 16, 4, 14, 1, 7, 3, 2, 15, 10, 11, 9, 8, 5, 13, 12) < ...

最佳答案

假设我了解您的要求,您可以尝试对 data.frame 进行排序,然后传递 fac1作为(顺序)级别。

data$fac1 <- factor(data$fac1, levels = data[order(data$fac2), "fac1"])
levels(data$fac1)

> data
   fac1 fac2
1  jj45   md
2  yy85   md
3  ee78   md
4  ww77   md
5  dd85   av
6  jj63   av
7  ee12   av
8  ee01   av
9  yy25   zr
10 tt23   zr
11 tt78   zr
12 qq74   zr
13 qe89   kj
14 gs85   kj
15 vd51   kj
16 vd41   kj
> levels(data$fac1)
 [1] "jj45" "yy85" "ee78" "ww77" "dd85" "jj63" "ee12" "ee01" "yy25"
[10] "tt23" "tt78" "qq74" "qe89" "gs85" "vd51" "vd41"

关于根据另一个因子重新排序因子水平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44693041/

相关文章:

r - 如何仅舍入数据框中的数值?

r - 具有与值对相关的随机实验的函数

r - 数值转换 R 中的 as.factor()

r - 删除列表中所有子元素都存在的元素

sql-server - 为什么通过函数调用 dbListTables 时会给出警告消息? (R DBI)

r - 使用变量调用 R 中的特定列?

r - 如何根据每个元素中有多少个字符来拆分 R 中的列?

css - R:突出显示 Shiny 的数据表

r - 求R中同名列之间的最大差异

r - 以 30 分钟间隔创建时间序列