将值推到左侧,用零替换NA

时间:2016-04-19 07:44:11

标签: r dataframe

我有这种data.frame

mydata <- data.frame(matrix(seq(20*3), 5, 6)) 
mydata[1,1:3] <-  NA 
mydata[2,1:1] <-  NA 
mydata[2,4] <-  NA 
mydata[3,1:3] <-  NA 
mydata[3,5:6] <-  NA 
mydata[4,2:4] <-  NA 
mydata[5,1:2] <-  NA 

看起来像这样:

UserID    X1    X2    X3    X4    X5    X6
1         NA    NA    NA    16    21    26
2         NA    7     12    NA    22    27 
3         NA    NA    NA    18    NA    NA
4         4     NA    NA    NA    24    29
5         NA    NA    15    20    25    30

我想运行一些代码来找到第一个非NA值,然后从那里推回序列,并用0替换所有NA。所以数据看起来像这样:

UserID    X1    X2    X3    X4    X5    X6
1         16    21    26     0     0     0
2         7     12     0    22    27     0
3         18     0     0     0     0     0
4         4      0     0     0    24    29
5         15    20    25    30     0     0

1 个答案:

答案 0 :(得分:2)

我们可以使用applyMARGIN=1循环遍历行,识别第一个非NA值的索引(&#39; i1&#39;),从该索引获取值向量的结尾,将其余部分与NA连接,replaceNA与0连接,转置输出并将其分配回数据集。

mydata[-1] <-  t(apply(mydata[-1], 1, function(x) {
                      i1 <- which(!is.na(x))[1]
                      x1 <- c(x[i1:length(x)], rep(NA, i1-1))
                      replace(x1, is.na(x1), 0)
                }))
mydata
#  UserID X1 X2 X3 X4 X5 X6
#1      1 16 21 26  0  0  0
#2      2  7 12  0 22 27  0
#3      3 18  0  0  0  0  0
#4      4  4  0  0  0 24 29
#5      5 15 20 25 30  0  0

数据

mydata <- cbind(UserID=1:5, mydata)