【问题标题】:dplyr::arrange with a column of numeric factorsdplyr::arrange 与一列数字因子
【发布时间】:2018-04-04 02:08:16
【问题描述】:

我确信这是一个简单的解决方法,但我已经解决了一个小时。

DataFrame 看起来像这样:

> head(cpgval.filtered)
      X        CpG txpt  tss
1 72923 cg15319295 XIST XIST
2 72924 cg03554089 XIST XIST
3 72925 cg12653510 XIST XIST
4 72926 cg05533223 XIST XIST
5 72927 cg11717280 XIST XIST
6 72928 cg20698282 XIST XIST
                                                                                        CellLine      Meth
1 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged.P103.total.DNA.methylation.RepB 0.8141782
2 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged.P103.total.DNA.methylation.RepB 0.9349818
3 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged.P103.total.DNA.methylation.RepB 0.7045790
4 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged.P103.total.DNA.methylation.RepB 0.9728426
5 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged.P103.total.DNA.methylation.RepB 0.8467799
6 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged.P103.total.DNA.methylation.RepB 0.8038316
  OrigOrder                                              CultureConditions GroupNumber         corr      PVal
1         7 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged           1  0.346066701 0.3616219
2         7 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged           1 -0.396517739 0.2907117
3         7 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged           1 -0.337107272 0.3750063
4         7 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged           1  0.063036561 0.8720074
5         7 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged           1 -0.007955937 0.9837932
6         7 hESCs.cultured.on.mouse.feeder.layer.and.mechanically.passaged           1  0.360234098 0.3409356
  Passage
1     103
2     103
3     103
4     103
5     103
6     103

段落列由 8 个不同的数字组成:

> unique(cpgval.filtered$Passage)
[1] 103 104 147 161 41  42  5   6  
Levels: 103 104 147 161 41 42 5 6

我想按通道顺序 5,6,41,42,103,104,147,161 排列数据帧

所以,我打电话:

cpgval.filtered <- cpgval.filtered %>% dplyr::arrange(as.numeric(Passage))

我得到了和我原来的数据框一样的东西:

> unique(cpgval.filtered$Passage)
[1] 103 104 147 161 41  42  5   6  
Levels: 103 104 147 161 41 42 5 6

看起来它是根据第一个数字而不是数字的实际值排序的。什么鬼?

【问题讨论】:

  • cpgval.filtered$Passage=as.numeric(as.character(cpgval.filtered$Passage))
  • 查看as.numeric(cpgval.filtered$Passage) 的结果 - 我想你会感到惊讶。那就试试as.numeric(as.character(cpgval.filtered$Passage))
  • 温的评论成功了!谢谢!有人可以解释发生了什么吗?
  • @AlexNesta - 您正在使用factor - 看看x &lt;- factor(c(1,1,2), levels=1:2, labels=c(100,11)) 并注意这些值是如何存储和标记的,然后尝试as.numeric(x) 等...

标签: r dataframe dplyr


【解决方案1】:

当我们告诉 R 将字符向量转换为因子时,它会根据字母顺序分配因子级别(因子的底层数字表示)。如果您的字符向量代表实际数字,事情就会变得混乱。考虑:

factor(1:10)
 [1] 1  2  3  4  5  6  7  8  9  10
Levels: 1 2 3 4 5 6 7 8 9 10

factor(as.character(1:10))
[1] 1  2  3  4  5  6  7  8  9  10
Levels: 1 10 2 3 4 5 6 7 8 9

请注意,在第一种情况下,因子水平按照我们的预期分配,因为原始数据是数字数据。但是,在第二种情况下,被转换的向量是字符串,其中“1”和“10”首先是“按字母顺序”。

在您的情况下,我猜Passage 列是作为字符数据而不是数字导入的,而数字又被转换为违反直觉的因素水平。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    相关资源
    最近更新 更多