R-对空列重新排序

R-对空列重新排序,r,dataframe,R,Dataframe,我有下一个问题。 如果我有下面的数据帧db,并且我想重新排列列,使它们保持空列在末尾(如db2中)。 我如何动态地完成它? 多谢各位 db<-data.frame(N=c(2,4,6,8), a=c(1,1,1,1), b=c(1,1,1,1), c=c(NA,1,1,1), d=c(NA,1,1,1), e=c(NA,NA,1,1),

我有下一个问题。 如果我有下面的数据帧db,并且我想重新排列列,使它们保持空列在末尾(如db2中)。 我如何动态地完成它? 多谢各位

db<-data.frame(N=c(2,4,6,8),
               a=c(1,1,1,1),
               b=c(1,1,1,1),
               c=c(NA,1,1,1),
               d=c(NA,1,1,1),
               e=c(NA,NA,1,1),
               f=c(NA,NA,1,1),
               g=c(NA,NA,NA,1),
               h=c(NA,NA,NA,1))

db2<-data.frame(N=c(2,4,6,8),
                a=c(NA,NA,NA,1),
                b=c(NA,NA,1,1),
                c=c(NA,1,1,1),
                d=c(1,1,1,1),
                e=c(1,1,1,1),
                f=c(NA,1,1,1),
                g=c(NA,NA,1,1),
                h=c(NA,NA,NA,1))

  N  a  b  c d e  f  g  h
1 2 NA NA NA 1 1 NA NA NA
2 4 NA NA  1 1 1  1 NA NA
3 6 NA  1  1 1 1  1  1 NA
4 8  1  1  1 1 1  1  1  1

db如果每行的NAs数量始终为偶数,则在行中循环,通过在开始和结束处附加一半的NAs来重新排列NA

db[-1] <- t(apply(db[-1], 1, function(x) {
     i1 <- is.na(x)
    if(sum(i1) > 0) setNames(c(rep(NA,sum(i1)/2), x[!i1], 
       rep(NA, sum(i1)/2)), names(x)) else x}))
db
#  N  a  b  c d e  f  g  h
#1 2 NA NA NA 1 1 NA NA NA
#2 4 NA NA  1 1 1  1 NA NA
#3 6 NA  1  1 1 1  1  1 NA
#4 8  1  1  1 1 1  1  1  1

db[-1]您是否总是每行有偶数个NAs?是的,总是这样。具有偶数和空的情况。