DF = structure(list(id = c(10, 11, 13), YR1 = c(NA, 1, NA), YR2 = c(NA, 2, 1), YR3 = c(1, 1, NA), YR4 = c(1, 1, 1), YR5 = c(NA, NA, 1)), .Names = c("id", "YR1", "YR2", "YR3", "YR4", "YR5"), row.names = c("1", "2", "3"), class = "data.frame")

   id YR1 YR2 YR3 YR4 YR5
1  10  NA  NA   1   1  NA
2  11   1   2   1   1  NA
3  13  NA   1  NA   1   1

像这样,如何右对齐和左对齐此data.frame(可以是矩阵)?
   id YR1 YR2 YR3 YR4 YR5
1  10  NA  NA  NA   1   1
2  11  NA   1   2   1   1
3  13  NA   1  NA   1   1

   id YR1 YR2 YR3 YR4 YR5
1  10   1   1  NA  NA  NA
2  11   1   2   1   1  NA
3  13   1  NA   1   1  NA

最佳答案

我们可以使用applyMARGIN = 1

DF[-1] <- t(apply(DF[-1], 1, FUN = function(x) {
                i1 <- range(which(!is.na(x)))
                i2 <- seq_along(x)
                i3 <- which(!i2 %in% i1[1]:i1[2])
                c(x[i3], x[setdiff(i2, i3)])
            }))
DF
#  id YR1 YR2 YR3 YR4 YR5
#1 10  NA  NA  NA   1   1
#2 11  NA   1   2   1   1
#3 13  NA   1  NA   1   1

对于第二种情况,只需逆转最后一步
 DF[-1] <- t(apply(DF[-1], 1, FUN = function(x) {
                i1 <- range(which(!is.na(x)))
                i2 <- seq_along(x)
                i3 <- which(!i2 %in% i1[1]:i1[2])
                c(x[setdiff(i2, i3)], x[i3])
            }))
DF
#  id YR1 YR2 YR3 YR4 YR5
#1 10   1   1  NA  NA  NA
#2 11   1   2   1   1  NA
#3 13   1  NA   1   1  NA

为了易于使用,我们可以创建一个函数来执行此操作
f1 <- function(x, rightAlign = TRUE){
    i1 <- range(which(!is.na(x)))
    i2 <- seq_along(x)
    i3 <- which(!i2 %in% i1[1]:i1[2])
    if(rightAlign){
       c(x[i3], x[setdiff(i2, i3)])
      } else  c(x[setdiff(i2, i3)], x[i3])
   }
DF[-1] <- t(apply(DF[-1], 1, f1))

对于第二种情况
DF[-1] <- t(apply(DF[-1], 1, f1, rightAlign = FALSE))

注意:我们将初始数据集用于rightAlign / leftAlign

10-08 04:18
查看更多