将非 NA 值堆叠到每列的顶部
Stack non-NA values to the top of each column
我有一个数据框,其中包含列中的值和 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 值堆叠到每列的顶部。有没有简单的方法可以做到这一点?
您可以使用 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")
这应该可以解决问题:
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
您可以使用 data.table
包以获得更大的灵活性 -
> setDT(df1)
> df1[,(names(df1)) := lapply(.SD, function(x) x[order(is.na(x))]),.SDcols=names(df1)]
注意:您可以select使用要排序的列。
> df1[,(c("A","B")) := lapply(.SD, function(x) x[order(is.na(x))]),.SDcols=c("A","B")]
我有一个数据框,其中包含列中的值和 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 值堆叠到每列的顶部。有没有简单的方法可以做到这一点?
您可以使用 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")
这应该可以解决问题:
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
您可以使用 data.table
包以获得更大的灵活性 -
> setDT(df1)
> df1[,(names(df1)) := lapply(.SD, function(x) x[order(is.na(x))]),.SDcols=names(df1)]
注意:您可以select使用要排序的列。
> df1[,(c("A","B")) := lapply(.SD, function(x) x[order(is.na(x))]),.SDcols=c("A","B")]