R:在满足条件之前和之后替换向量中的值
R: replace values in a vector before and after a condition is met
考虑一个带有缺失值的向量:
myvec <- c('C', NA, 'test', NA, 'D')
[1] "C" NA "test" NA "D"
如何将 'test' 之前的向量中的所有元素替换为 'good' 以及之后的 'bad'?结果应该是:
[1] "good" "good" "test" "bad" "bad"
我下面的尝试只成功地用 'good' 替换了所有内容,这不太好:
replace(myvec, is.na(myvec) | myvec!='test', 'good')
[1] "good" "good" "test" "good" "good"
一个选项是使用 diff
和 cumsum
c('good', 'test', 'bad')[cumsum(c(TRUE, abs(diff(myvec == "test" & !is.na(myvec)))==1))]
#[1] "good" "good" "test" "bad" "bad"
或使用which
i1 <- which(myvec=='test')
myvec[1:(i1-1)] <- 'good'
myvec[(i1+1):length(myvec)] <- 'bad'
或者@nicola在评论中提到,sign
和match
可以一起使用
c("good","test","bad")[sign(seq_along(myvec)-match("test",myvec))+2]
考虑一个带有缺失值的向量:
myvec <- c('C', NA, 'test', NA, 'D')
[1] "C" NA "test" NA "D"
如何将 'test' 之前的向量中的所有元素替换为 'good' 以及之后的 'bad'?结果应该是:
[1] "good" "good" "test" "bad" "bad"
我下面的尝试只成功地用 'good' 替换了所有内容,这不太好:
replace(myvec, is.na(myvec) | myvec!='test', 'good')
[1] "good" "good" "test" "good" "good"
一个选项是使用 diff
和 cumsum
c('good', 'test', 'bad')[cumsum(c(TRUE, abs(diff(myvec == "test" & !is.na(myvec)))==1))]
#[1] "good" "good" "test" "bad" "bad"
或使用which
i1 <- which(myvec=='test')
myvec[1:(i1-1)] <- 'good'
myvec[(i1+1):length(myvec)] <- 'bad'
或者@nicola在评论中提到,sign
和match
可以一起使用
c("good","test","bad")[sign(seq_along(myvec)-match("test",myvec))+2]