如何将单个 NA 移动到 R 中列的底部

How to shift single NA to bottom of column in R

我有以下数据框:

example=data.frame(x=c(1,2,3),y=c(4,5,6))


     x     y
1    1     4
2    2     5
3    3     6

我想从其中 1 列中删除一个值,所以我得到了这个(我使用 example$x[example$x==2]<-NA 实现):

     x     y
1    1     4
2    NA    5
3    3     6

但现在我卡住了,因为我现在想将剩余的值向上移动,以便 NA 位于底部:

     x     y
1    1     4
2    3     5
3    NA    6

最终我希望能够对两列执行此操作,在不同的行中使用单个值,例如:

来自:

     x     y
1    1     NA
2    NA    5
3    3     6

收件人:

     x     y
1    1     5
2    3     6
3    NA    NA

希望有人有一个简单的解决方案!谢谢

这是一个使用 is.na 和子集 [ 的方法。从这个数据集开始。

example=data.frame(x=c(1,NA,3),y=c(NA,5,6))
example
   x  y
1  1 NA
2 NA  5
3  3  6

你 运行 通过 lapply 遍历每个变量并获取不丢失的变量,并在末尾附加这些缺失值。然后使用 example[] <- 将此结果反馈回原始数据集,它保持 data.frame 结构。

example[] <- lapply(example, function(x) c(x[!is.na(x)], x[is.na(x)]))
example
   x  y
1  1  5
2  3  6
3 NA NA

我们也可以像这样使用更新的 (R 3.3.3) grouping 函数

example[] <- lapply(example, function(x) x[grouping(is.na(x))])

order

example[] <- lapply(example, function(x) x[order(is.na(x))])

在最后两个中,关键是在 is.na 上排序而不是元素本身。这样您就可以保留非空元素的原始顺序。

我们也可以用tidyverse

library(dplyr)
example %>% 
   mutate_all(funs(.[order(is.na(.))]))
#   x  y
#1  1  5
#2  3  6
#3 NA NA

如果列需要依赖

example %>% 
        arrange_all(funs(is.na(.)))