我有以下数据框:
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
希望有人有一个简单的解决方案!感谢
答案 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