我有一个数据框,其中包含列中的值和NA。数据框如下所示:
A B C D
1 NA NA NA
NA 2 3 NA
NA 4 NA NA
5 NA NA 6
我正在尝试将其转换为如下形式:
A B C D
1 2 3 6
5 4 NA NA
NA NA NA NA
NA NA NA NA
通过将非NA值堆叠到每一列的顶部来。有没有简单的方法可以做到这一点?
答案 0 :(得分:4)
您可以使用lapply
通过NA
值对每一列进行排序。请记住,这将保留非NA
列的顺序,而x[order(x)]
只会重新排列列的顺序:
df1[] <- lapply(df1, function(x) x[order(is.na(x))])
df1
A B C D
1 1 2 3 6
2 5 4 NA NA
3 NA NA NA NA
4 NA NA NA NA
数据:
df1 <- read.table(header = T, text = "A B C D
1 NA NA NA
NA 2 3 NA
NA 4 NA NA
5 NA NA 6")
答案 1 :(得分:0)
这应该可以解决问题:
data<- data.frame(A=c(1, NA,NA,5),
B=c(NA,2,4,NA),
C=c(NA,3,NA,NA),
D=c(NA,NA,NA, 6))
apply(data,2,function(x)c(x[!is.na(x)], rep(NA,(length(x)-length(x[!is.na(x)])))) )
A B C D
[1,] 1 2 3 6
[2,] 5 4 NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA
答案 2 :(得分:0)
您可以使用data.table
软件包以提高灵活性-
> setDT(df1)
> df1[,(names(df1)) := lapply(.SD, function(x) x[order(is.na(x))]),.SDcols=names(df1)]
注意:您可以选择使用要订购的列。
> df1[,(c("A","B")) := lapply(.SD, function(x) x[order(is.na(x))]),.SDcols=c("A","B")]