查找向量r的先前n个值中是否存在值

时间:2016-11-01 15:52:40

标签: r

我是否错过了更好的方法 - 或者至少是一种允许改变窗口大小的方法?

说我有一个矢量,v。

v <- c(T,T,F,F,F,F,F,T,T,T,T,F,F,F,F,T,F,F,F,F,F,F,T,F)

我希望转换此向量,使得如果在前3个元素中出现TRUE,则FALSE将变为TRUE。例如位置3,4,5处的F也将切换到T,因为位置2处有T.位置6处的F不会。

解决方案,如果只对3窗口感兴趣:

vlag1 <- lag(v)
vlag2 <- lag(vlag1)
vlag3 <- lag(vlag2)
ifelse(v==T|vlag1==T|vlag2==T|vlag3==T,T,F)

给出了理想的结果:

 TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE

但是,如果我们想要将窗口改为例如4或5 - 有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

这是一个更加手动的解决方案:

# Input vector
v <- c(T,T,F,F,F,F,F,T,T,T,T,F,F,F,F,T,F,F,F,F,F,F,T,F)

# Size of the window
k <- 3

# Output vector
outp <- rep(F,length(v))

for(i in seq(length(v))){
  # Checking values on variable window
  aux <- v[seq(pmax(1,i-k),i)]
  # Writing on output vector
  outp[i] <- any(aux==T)
}

outp

答案 1 :(得分:0)

您可以使用rollapply包中的zoo执行此操作:

library(zoo)

rollapply(v,
          width = 4, align = "right", partial = TRUE,
          FUN = function(x) ifelse(TRUE %in% x, TRUE, FALSE))

请注意,我在此设置了width = 4,而不是3.在您的问题中,您说您想要检查前3个元素。宽度包括第i个元素。所以,如果你想把结果放在前面的3上,你必须将宽度设置为4.你还需要包含align = "right"来回顾第i个元素(第i个元素的默认中心,你也可以展望align = "left")。

答案 2 :(得分:0)

以下是data.table

的一个选项
library(data.table)
n <- 3
r1 <- Reduce(`|`, shift(v, seq_len(n), fill = FALSE))
identical(r1, r2)
#[1] TRUE

其中'r2'是来自ifelse

的OP的输出