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

时间:2017-08-28 13:18:09

标签: r dataframe na

我有以下数据框:

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

但现在我陷入了困境,因为我现在想要将剩余的值向上移动,以便NAs位于底部:

     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

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

2 个答案:

答案 0 :(得分:2)

以下是使用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而不是元素本身进行排序。这样就可以保留非空元素的原始顺序。

答案 1 :(得分:2)

我们也可以使用navigation

tidyverse

如果列需要依赖

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