2017-09-29 42 views
0

在理解这里发生的事情时有点麻烦,在我看来,这两种排序下面数据框的方法是等价的。为什么R中的order()在传递子集数据框时会生成NA?

我们的数据帧,

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

我相信这是因为'order'强制你的'df'为'matrix',然后对它进行排序。由于'R'中的矩阵只是具有'dim'属性的矢量,输出是第一列的顺序,后面是第二列的顺序。那么,什么索引'df'是一个长度为10的向量。尝试只运行'order'而不使用'df'并查看结果。 –

+0

订单不适用于子集数据框,因为它根本不适用于数据框。当你在向量上调用它时(它恰好是数据框中的列),它确实有效。 – Gregor

回答

1

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

数字的,复杂的,字符或逻辑向量的序列,所有具有相同长度的,或归类ř对象。

没有什么真的表明它可以在数据帧上工作。 “分类的R对象”有点含糊,并暗示数据框不会抛出错误,但它肯定不会说“或数据框”。

说明说:

请参阅如何使用这些功能对数据帧进行排序的示例等

当你调用order或数据帧,你可以看到会发生什么情况:

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

它看起来像是将数据帧强制转换为向量,而ord它是。通常不是很有用。这就是为什么当你运行df[order(df[,c("chr","id")]),]时,你会得到NA行。您的输入数据帧有2列,因此order()输出的行数是数据帧的两倍。

您已经找到了订购数据帧的正确方法,即将实际向量输入order。矢量可以是数据框的单独列,也可以是正确长度的其他矢量。

相关问题