【问题标题】:R: replace values in a vector before and after a condition is metR:在满足条件之前和之后替换向量中的值
【发布时间】:2017-03-16 00:51:05
【问题描述】:

考虑一个缺失值的向量:

myvec <- c('C', NA, 'test', NA, 'D')

[1] "C"   NA   "test"  NA   "D"   

如何将“test”之前的向量中的所有元素替换为“good”,然后用“bad”替换?结果应该是:

[1] "good" "good" "test" "bad"  "bad" 

我在下面的尝试仅成功地将所有内容都替换为“好”,这不太好:

replace(myvec, is.na(myvec) | myvec!='test', 'good')

[1] "good" "good" "test" "good" "good"

【问题讨论】:

    标签: r vector replace conditional


    【解决方案1】:

    一种选择是使用diffcumsum

    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'
    

    或者如cmets中提到的@nicola,可以使用signmatch

    c("good","test","bad")[sign(seq_along(myvec)-match("test",my‌​vec))+2]
    

    【讨论】:

    • 不错。要“合并”您的两个想法,还可以考虑c("good","test","bad")[sign(seq_along(myvec)-match("test",myvec))+2]
    • @nicola 的方法更加健壮,因为它可以正确处理 test 放置在第一个或最后一个位置而其他两个可能失败的情况。
    • @989 无论如何,没什么大不了的。感谢您的 cmets。
    猜你喜欢
    • 2022-12-08
    • 2020-08-29
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多