是否有一种方法可以填充NA,直到满足一行中的条件,并在r中向前移动所有值



样本数据如下:

temp <- data.frame(c1 = c(NA, 1, NA, NA), c2 = c(1, 1, 1, 1), c3 = c(NA, 20, NA, 2), c4 = c(8, NA, 100, NA), c5 = c(10, 2, 4, NA))
temp
c1 c2 c3  c4 c5
1 NA  1 NA   8 10
2  1  1 20  NA  2
3 NA  1 NA 100  4
4 NA  1  2  NA NA

这就是我想要得到的:

c1 c2 c3  c4 c5
1   8 10 NA  NA NA
2  20 NA  2  NA NA
3 100  4 NA  NA NA
4  NA NA NA  NA NA

使用>5作为每行的条件,如果不满足>5个条件,然后向前移动行中的所有值。

apply(temp, 1, function(x) {if (all(is.na(x))) {NA} else {which.max(x > 5)} })可以找到第一个值,但我找不到一种方法将之前的所有值都改为NA,并在没有许多for循环的情况下将其余部分向前移动,你对此有什么建议吗?

这里有一个选项

t(apply(temp, 1, function(x) {
i1 <- which(x > 5)[1]
if(!is.na(i1)) {
x[seq_len(i1-1)] <- NA
`length<-`(x[i1:length(x)], length(x))
} else rep(NA, length(x))}))

-输出

#      [,1] [,2] [,3] [,4] [,5]
#[1,]    8   10   NA   NA   NA
#[2,]   20   NA    2   NA   NA
#[3,]  100    4   NA   NA   NA
#[4,]   NA   NA   NA   NA   NA

相关内容

最新更新