在理解这里发生的事情时遇到一些麻烦,在我看来,下面对数据框进行排序的两种方法都是等价的。
我们的数据框,
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不可互换吗?
答案 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
提供实际向量。向量可以是数据框的单个列,也可以是其他正确长度的向量。