如何强制所有数据在同一行结束?

How to force all data in to end on the same row?

我有一堆列都在同一行开始,但我希望它们都在同一行结束。这是一个简化的例子

A <- c(2,7,3,5,5,9,8,1,NA,NA)
B <- c(NA,5,2,1,6,4,6,7,NA,NA)
C <- c(NA,NA,NA,NA,3,6,7,1,5,6)

Start <- cbind(A,B,C) 

给出:

       A  B  C
 [1,]  2 NA NA
 [2,]  7  5 NA
 [3,]  3  2 NA
 [4,]  5  1 NA
 [5,]  5  6  3
 [6,]  9  4  6
 [7,]  8  6  7
 [8,]  1  7  1
 [9,] NA NA  5
[10,] NA NA  6

但我想操纵它,所以它的输出是这样的:

       A  B  C
 [1,] NA NA NA
 [2,] NA NA NA
 [3,]  2 NA NA
 [4,]  7  5 NA
 [5,]  3  2  3
 [6,]  5  1  6
 [7,]  5  6  7
 [8,]  9  4  1
 [9,]  8  6  5
[10,]  1  7  6

无法在此站点上真正找到解决方案。感谢您的帮助。

你可以试试:

apply(Start, 2, function(x) rev(`length<-`(na.omit(rev(x)), nrow(Start))))

       A  B  C
 [1,] NA NA NA
 [2,] NA NA NA
 [3,]  2 NA NA
 [4,]  7  5 NA
 [5,]  3  2  3
 [6,]  5  1  6
 [7,]  5  6  7
 [8,]  9  4  1
 [9,]  8  6  5
[10,]  1  7  6

我们可以试试 apply + is.na

apply(Start,2,function(x) c(x[is.na(x)],x[!is.na(x)]))

apply(Start,2,function(x) do.call(c,rev(split(x,is.na(x)))))

这样

       A  B  C
 [1,] NA NA NA
 [2,] NA NA NA
 [3,]  2 NA NA
 [4,]  7  5 NA
 [5,]  3  2  3
 [6,]  5  1  6
 [7,]  5  6  7
 [8,]  9  4  1
 [9,]  8  6  5
[10,]  1  7  6

这里有一个排序参数:

A <- c(2,7,3,5,5,9,8,1,NA,NA)
B <- c(NA,5,2,1,6,4,6,7,NA,NA)
C <- c(NA,NA,NA,NA,3,6,7,1,5,6)

Start <- as.data.frame(cbind(A,B,C) ) # added "as.data.frame" here ..

do.call(cbind, lapply(Start, sort, na.last = FALSE))

或者:

do.call(cbind, lapply(Start, function(x) {
  res <- sort(x, na.last = FALSE)
  res[!is.na(res)] <- x[!is.na(x)]
  res
}))

#     A  B  C
# [1,] NA NA NA
# [2,] NA NA NA
# [3,]  2 NA NA
# [4,]  7  5 NA
# [5,]  3  2  3
# [6,]  5  1  6
# [7,]  5  6  7
# [8,]  9  4  1
# [9,]  8  6  5
#[10,]  1  7  6