【问题标题】:How to have NA's displayed first using arrange()如何使用排列()首先显示 NA
【发布时间】:2014-10-05 04:46:15
【问题描述】:

样本数据:

temp = data.frame(col = list(NA, 1, 2, 3) )

使用arrange

temp %>%
    arrange(col)

给予

  col
1   1
2   2
3   3
4  NA

temp %>%
            arrange(desc(col))

给予

  col
1   3
2   2
3   1
4  NA

我想要

  col
1   NA
2   3
3   2
4   1

也就是说,将NAs 放在首位。有谁知道怎么做?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你也可以这样做:

     m %>%
     arrange(!is.na(wt), wt) #@Spacedman's dataset
     #    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
     #1  18.7   8 360.0 175 3.15    NA 17.02  0  0    3    2
     #2  24.4   4 146.7  62 3.69    NA 20.00  1  0    4    2
     #3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
     #4  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
     #5  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
     #6  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
     #7  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
     #8  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
     #9  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
     #10 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
    

    【讨论】:

    • @user3858 这里我们按照TRUE/FALSE的逻辑向量!is.na(wt)来排列。因此,现在它将根据字母排序,即sort(sample(c(TRUE, FALSE), 10, replace = TRUE)),或者如果我们使用is.na,那么set.seed(24); sort(!is.na(sample(c(1:3, NA), 10, replace = TRUE))) 请注意,FALSE 中的 F 在 TRUE 中的 T 之前按字母顺序
    【解决方案2】:

    编写一个对数据框进行排序的函数,然后将方便的na.last=FALSE 选项传递给order。我的原始版本可以在编辑历史中找到,David Arenburg 将其改进为:

    > sortNA=function(d,n,...){d[order(d[[deparse(substitute(n))]],...),]}
    

    然后这样使用

    > m=mtcars[1:10,]
    > m$wt[5]=NA
    > m$wt[8]=NA
    > m %.% sortNA(wt, na.last=FALSE)
                       mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Hornet Sportabout 18.7   8 360.0 175 3.15    NA 17.02  0  0    3    2
    Merc 240D         24.4   4 146.7  62 3.69    NA 20.00  1  0    4    2
    Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
    Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
    Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
    Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
    Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
    

    添加decreasing=TRUE以相反的顺序排序。

    您也可以考虑将问题发布到 dplyr github 问题跟踪器,以建议 arrange 函数执行此操作的新选项。

    【讨论】:

    • 谢谢。我想知道这个或akrun的解决方案是否更快?由于 Akrun 的解决方案使用内置的排列功能,但这个使用顺序?
    • 我在 my duplicate of this question 中使用了类似的 hack。
    【解决方案3】:

    基础 R 中的 order 函数有一个 na.last 参数:

    > temp=data.frame(col=c(NA,1,2,3))
    > temp[order(temp[,"col"],na.last=F),]
    [1] NA  1  2  3
    

    【讨论】:

      猜你喜欢
      • 2021-01-12
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 2019-10-14
      • 2022-01-06
      • 2016-10-26
      相关资源
      最近更新 更多