dplyr ::使用一列数字因子排列

时间:2018-04-04 02:08:17

标签: r dataframe dplyr

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

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

看起来它是根据第一个数字而不是数字的实际值进行排序。 WTF?

1 个答案:

答案 0 :(得分:2)

当我们告诉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

请注意,在第一种情况下,因子原始数据是数字,因此会按预期分配因子级别。但是,在第二种情况下,转换的向量是 strings ,其中“1”和“10”首先是“按字母顺序”。

在您的情况下,我猜测Passage列是作为字符数据导入而不是数字,而后者又被转换为违反直觉的因子级别。