如何使用arrange()函数让NA值排在前面显示

32

示例数据:

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

也就是说,要把NA值放在第一位。有人知道怎么做吗?

3个回答

71

你也可以这样做:

 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

2
@user3858 这里我们按照逻辑向量!is.na(wt)的TRUE/FALSE进行排列。因此,现在它将基于字母顺序排序,即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。 - akrun

5
写一个函数来对数据框进行排序,然后将方便的 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的解决方案使用了内置的arrange函数,但是这个解决方案使用了order? - Alex
我在我的这个问题的副本中使用了类似的技巧。 - mschilli

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接