如何相对于NA单元“右对齐”和“左对齐”data.frame行?

时间:2016-08-29 15:25:30

标签: r dataframe

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  

1 个答案:

答案 0 :(得分:1)

我们可以将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))

注意:我们使用了右对齐/左对齐

的初始数据集