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
答案 0 :(得分:1)
我们可以将apply
与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
对于第二种情况,只需反转最后一步
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))
注意:我们使用了右对齐/左对齐
的初始数据集