代码之家  ›  专栏  ›  技术社区  ›  James Anthony Perez

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

  •  0
  • James Anthony Perez  · 技术社区  · 8 年前

    在理解这里发生的事情时有点困难,在我看来,对下面的数据帧进行排序的两种方法是等效的。

    我们的数据帧,

    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
    

    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
    

    order() 如中所示,

    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 回复  |  直到 8 年前
        1
  •  2
  •   Gregor Thomas    8 年前

    当我们看到 ?order ,其第一个参数记录为:

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

    描述 说:

    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()

    您已经找到了对数据帧进行排序的正确方法,即为 顺序