从第一次出现模式到结束设置值NA

时间:2018-08-06 14:55:09

标签: r

是否存在一种更快/更短的方式来设置NA之后并包括与之匹配的值?

vec <- 1:10;vec[c(3,5,7)]<-c(NA,NaN,"remove")
#"1"      "2"      NA       "4"      "NaN"    "6"      "remove" "8"      "9"      "10"    

所需结果:

#"1"      "2"      NA       "4"      "NaN"    "6"      NA       NA       NA       NA

我的代码:

vec[{grep("^remove$",vec)[1]}:length(vec)]<-NA

请注意:

在这种情况下,我们假定将有一个“删除”元素。因此,该解决方案不必考虑没有任何情况的情况。

4 个答案:

答案 0 :(得分:3)

找到第一个匹配项后,您可以使用match停止搜索:

m = match("remove", vec) - 1L
if (is.na(m)){
  vec 
} else {
  c(head(vec, m), rep(vec[NA_integer_], length(vec)-m))
}

不过,我想您必须有一个很大的向量才能注意到速度差异。或者,这可能会证明更快:

m = match("remove", vec)
if (!is.na(m)){
  vec[m:length(vec)] <- NA 
}

答案 1 :(得分:3)

不确定是更短还是更快,但这是一种选择:

vec[which.max(vec == "remove"):length(vec)] <- NA
vec
#[1] "1"   "2"   NA    "4"   "NaN" "6"   NA    NA    NA    NA   

在这里,我们使用which.max找到“删除”的第一个匹配项,然后将NA添加到向量的末尾。


OP提到总是存在一个“删除”元素,因此我们不必照顾其他情况,如果我们仍然想保留支票,可以添加一个附加条件。

inds <- vec == "remove"
if (any(inds)) {
  vec[which.max(inds) : length(vec)] <- NA
}

答案 2 :(得分:2)

我们可以在逻辑向量上使用cumsum

vec[cumsum(vec %in% "remove") > 0] <- NA

答案 3 :(得分:0)

我们还可以将vec扩展到所需的长度:

DesiredCapabilities