【问题标题】:Factor levels in a dataframe become NA after reverse ordering数据帧中的因子水平在反向排序后变为 NA
【发布时间】:2014-12-17 13:56:30
【问题描述】:

来自数据框列表,我将它们转换为列表中的向量:

vector3 <- lapply(list3, function(x) {as.numeric(as.vector(unlist(x)))})
names(vector3) <- as.factor(names(vector3))
names(vector3)
[1] "1"       "3"       "2"       "12"      "13"      "15"      "5"       "11"      "21"     
[10] "18"      "20"      "19"      "out"     "25"      "4"       "GBSL1B0" "6"       "17"     
[19] "11B2"    "9"       "ATs328"  "d142"    "10"      "B276D12" "TPD58"   "23"      "HoloI"  
[28] "7I"      "7II"     "8Holo"   "8Aca"    "BPU1C1g" "22"      "26"    

我将使用 ggplot2 进行箱线图绘制,因此我正在创建一个熔融数据框:

library(reshape2)
v3m <- melt(vector3)
head(v3m)
 value L1
1  83.0  1
2  83.3  1
3  83.0  1
4  83.8  1
5  82.8  1
6  83.0  1

L1 现在是初始列表中前一个向量的名称,并有望成为一个因素:

表(v3m$L1)

      1      10      11    11B2      12      13      15      17      18      19       2      20 
2376363  431959   98868    3531   11770   98868   56496  251878  130647    4708  479039    4708 
     21      22      23      25      26       3       4       5       6      7I     7II    8Aca 
 188320  353100  134178   81213   60027 1385329 2164503  313082 4002977  129470  281303   32956 
  8Holo       9  ATs328 B276D12 BPU1C1g    d142 GBSL1B0   HoloI     out   TPD58 
 141240  123585   29425    3531    2354    3531    2354   28248    5885   22363 

我想根据向量3中相反的初始顺序对因子水平进行重新排序:

v3m$L1 <- factor(v3m$L1,levels = rev(levels(v3m$L1)),ordered = TRUE)

但是现在:

head(v3m)
1  83.0 <NA>
2  83.3 <NA>
3  83.0 <NA>
4  83.8 <NA>
5  82.8 <NA>
6  83.0 <NA>
table(v3m$L1)
table of extent 0 >

L1 中的所有因子都变为 NA。我做错什么了?我现在觉得自己很傻。

这是一个由样本创建的向量测试列表。

dput(v3m)
structure(list(`1` = c(82.5, 82.2, 81.7, 83.2, 84.5, 82.1, 84, 
81.8, 84.1, 83.5), `3` = c(90.5, 92, 94.7, 92.7, 90.2, 91.2, 
85.7, 92.9, 92.9, 90.3), `2` = c(82.8, 81.7, 82, 81.9, 80.9, 
81.9, 81.7, 82.1, 81.5, 82.5), `12` = c(86, 85.3, 87.7, 87, 84.9, 
84.6, 84.4, 88.1, 86.8, 88.5), `13` = c(83.1, 83.2, 85, 83.9, 
82.6, 82.9, 83.7, 82.6, 82.7, 83.9), `15` = c(86.6, 84.6, 84, 
80.8, 83.6, 84.8, 84.8, 83.2, 85, 85.1), `5` = c(83, 81.5, 83.2, 
83.4, 81.8, 82.6, 83.4, 83.2, 83.9, 83), `11` = c(82.3, 82.2, 
83.1, 81, 81.4, 83.7, 82.1, 82.5, 82.7, 81.7), `21` = c(80.4, 
78.7, 78.7, 80.5, 81, 80.4, 79.9, 79.3, 80.4, 80), `18` = c(80.8, 
82.7, 81.9, 80.2, 81.2, 81.7, 80.5, 81, 81.3, 80.6), `20` = c(80.2, 
81.1, 82.2, 81.7, 81.5, 81.7, 80.1, 82.8, 81.3, 81.2), `19` = c(81.5, 
79.9, 79.7, 81.2, 81.3, 82.2, 81.8, 82.1, 82, 82.9), out = c(81.1, 
81.5, 80.9, 81.1, 80.5, 80.8, 81, 80.9, 80.9, 79.9), `25` = c(79.8, 
79.9, 78.8, 78, 78.6, 80.1, 78.6, 79.3, 78.8, 79.3), `4` = c(79.3, 
81.4, 80.8, 80, 80.4, 79.4, 79, 78.3, 79.1, 79.1), GBSL1B0 = c(76.4, 
75.2, 76.7, 78.6, 76.9, 76.3, 77.8, 79.2, 77.2, 77.1), `6` = c(80.3, 
81.2, 81.5, 81.3, 81.9, 82.6, 81.2, 81.5, 81.6, 81.1), `17` = c(82, 
80.7, 77.8, 81, 82.3, 80.9, 81.4, 80.9, 81.7, 82.6), `11B2` = c(82.2, 
79.9, 80.8, 80.8, 81.3, 82.7, 82, 81.5, 81.2, 82.1), `9` = c(80.8, 
80.6, 82.1, 80.6, 79.4, 82.3, 81.6, 81.4, 81, 79.5), ATs328 = c(81.1, 
80.7, 79.7, 81.9, 80.5, 80, 80.4, 81.2, 80.6, 79), d142 = c(80.2, 
80.8, 79.9, 79.4, 79.4, 80, 79.9, 81.5, 80.6, 80), `10` = c(79.9, 
80.6, 80.3, 79.8, 79, 79.2, 80.9, 80.6, 80, 78.5), B276D12 = c(80.6, 
78.9, 80.2, 79.6, 80, 79.6, 79.8, 79.2, 78.8, 79.6), TPD58 = c(79.2, 
80.3, 81.6, 80.5, 81.7, 81.6, 82.6, 80.4, 82.2, 82.2), `23` = c(78.2, 
80.2, 79.7, 79.8, 79.7, 80.4, 80.2, 77.8, 80, 79.9), HoloI = c(80.4, 
80.7, 80.7, 80.3, 80.3, 81, 79.8, 79, 77.9, 81.4), `7I` = c(80.2, 
81.8, 79.8, 80.7, 81, 78.7, 81.1, 79, 81.7, 81.4), `7II` = c(80.2, 
80.3, 80.7, 79.9, 80.5, 80, 81, 79.2, 81.9, 78), `8Holo` = c(80.2, 
82.5, 80.4, 79.5, 81.2, 79.4, 79, 80.9, 80, 79.6), `8Aca` = c(77.1, 
81.4, 80.7, 81.9, 81, 79.8, 79.9, 80.4, 78.9, 79), BPU1C1g = c(78.3, 
79.2, 76.9, 78.6, 79.1, 77.7, 78, 78.9, 78.5, 78), `22` = c(81.4, 
80.3, 80.1, 78.8, 81.1, 79.8, 81.1, 80.7, 81.8, 81.2), `26` = c(80.6, 
79.8, 80, 79, 80.6, 77.5, 80.6, 81.5, 79.8, 81.3)), .Names = c("1", 
"3", "2", "12", "13", "15", "5", "11", "21", "18", "20", "19", 
"out", "25", "4", "GBSL1B0", "6", "17", "11B2", "9", "ATs328", 
"d142", "10", "B276D12", "TPD58", "23", "HoloI", "7I", "7II", 
"8Holo", "8Aca", "BPU1C1g", "22", "26"))

有趣的是,如果我只是这样做

v3m$L1 <- factor(v3m$L1,levels = v3m$L1,ordered = TRUE)

我没有用“rev”颠倒顺序,而是得到

Warning message:
In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  :
  duplicated levels in factors are deprecated

但因子不会转换为 NA。但是,我没有在我的姓名列表中看到任何重复的级别。我想,名称列表中出现的数字可能会出现问题,但是如果所有名称都以“df_”开头,这种行为也会出现

谢谢!

【问题讨论】:

  • 嗯,以下工作没有错误或警告:x &lt;- factor(sample(letters)); x &lt;- factor(x, levels = rev(levels(x)))
  • 您的L1 列不是一个因素,因此没有级别。当您将 L1 转换为因子然后将其分配为 NULL 级别时,这就是您的代码无法按预期工作的原因。我认为以下方法有效:levels(v3m$L1) &lt;- rev(levels(v3m$L1&lt;-factor(v3m$L1)))(或者您可以在运行生产线之前将v3m$L1 作为一个因素)
  • 1.你是对的 str(v3m) 为 L1 提供了 chr,你的行确实分解了它! 2. 但是,如果我订购它,我会收到警告信息。我不完全确定,如果我可以忽略它。

标签: r


【解决方案1】:

答案是按级别排序是错误的。我需要创建一个以所有名称为因子的向量,将其反转,并使用它来订购箱线图:

vector3 <- lapply(list3, function(x) {as.numeric(as.vector(unlist(x)))})
nv3 <- rev(as.factor(names(vector3)))
v2m  <- melt(vector3)
v3m$L1 <- factor(v3m$L1, levels = nv3, ordered = TRUE)

抱歉打扰了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2021-11-14
    相关资源
    最近更新 更多