是否存在一种更快/更短的方式来设置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
请注意:
在这种情况下,我们假定将有一个“删除”元素。因此,该解决方案不必考虑没有任何情况的情况。
答案 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