样本数据如下:
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