为什么R中的order()在传递子集数据框时会生成NA?
问题描述:
在理解这里发生的事情时有点麻烦,在我看来,这两种排序下面数据框的方法是等价的。为什么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不可互换吗?
答
当我们看?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
。矢量可以是数据框的单独列,也可以是正确长度的其他矢量。
我相信这是因为'order'强制你的'df'为'matrix',然后对它进行排序。由于'R'中的矩阵只是具有'dim'属性的矢量,输出是第一列的顺序,后面是第二列的顺序。那么,什么索引'df'是一个长度为10的向量。尝试只运行'order'而不使用'df'并查看结果。 –
订单不适用于子集数据框,因为它根本不适用于数据框。当你在向量上调用它时(它恰好是数据框中的列),它确实有效。 – Gregor