2016-08-29 15 views
1
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(行列でもよい)を右揃えおよび左揃えにするにはどうすればよいですか?data.frame行をNAセルに対して「右揃え」および「左揃え」する方法は?

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

我々はMARGIN = 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 

applyを使用し、後者の場合のために、ただ単に使いやすさのために最後のステップ

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

の初期データセットを使用