我有这种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
答案 0 :(得分:2)
我们可以使用apply
与MARGIN=1
循环遍历行,识别第一个非NA值的索引(&#39; i1&#39;),从该索引获取值向量的结尾,将其余部分与NA连接,replace
将NA
与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)