为什么R中的order()在传递子集化数据帧时会生成NA?

时间:2017-09-29 16:05:12

标签: r columnsorting

在理解这里发生的事情时遇到一些麻烦,在我看来,下面对数据框进行排序的两种方法都是等价的。

我们的数据框,

cols <- c("chr","id","value")
df <-   data.frame(c(1:5),c("ENSG1","ENSG2","ENSG3","ENSG4","ENSG5"),runif(5,5.0,10.0))
names(df) <- cols
df <- df[sample(nrow(df)),]
df

chr    id    value
5      ENSG5 8.913645
2      ENSG2 6.117744
4      ENSG4 8.558403
3      ENSG3 9.625546
1      ENSG1 6.105577

现在,方法1:

df[order(df[,c("chr","id")]),]

chr    id    value
1      ENSG1 6.105577
2      ENSG2 6.117744
3      ENSG3 9.625546
4      ENSG4 8.558403
5      ENSG5 8.913645
NA    <NA>       NA
NA    <NA>       NA
NA    <NA>       NA
NA    <NA>       NA
NA    <NA>       NA

由于一些奇怪的原因而在NAs中抛出,而将df列传递给order(),如,

方法2:

df[order(df$chr,df$id),]

chr    id    value
1      ENSG1 6.105577
2      ENSG2 6.117744
3      ENSG3 9.625546
4      ENSG4 8.558403
5      ENSG5 8.913645

或者不。

有人可以解释为什么方法1和方法2不可互换吗?

1 个答案:

答案 0 :(得分:1)

当我们查看?order时,它的第一个参数记录为:

  

一系列数字,复数,字符或逻辑向量,所有长度相同,或者是R类对象。

没有什么能真正表明它适用于数据框架。 A&#34;分类R对象&#34;有点模糊,并建议数据框架不会抛出错误,但它肯定不会说#34;或数据框&#34;。

描述说:

  

请参阅示例,了解如何使用这些函数对数据框进行排序等。

当您致电order或数据框时,您可以看到会发生什么:

order(data.frame(a = 1:5, b = 5:1))
# [1]  1 10  2  9  3  8  4  7  5  6

它看起来像是将数据帧强制转换为向量,并对其进行排序。一般不太有用。这就是为什么当您运行df[order(df[,c("chr","id")]),]时,您会获得NA行。您的输入数据框有2列,因此order()输出的行数是数据帧的两倍。

您已经找到了订购数据框的正确方法,即向order提供实际向量。向量可以是数据框的单个列,也可以是其他正确长度的向量。