我是否错过了更好的方法 - 或者至少是一种允许改变窗口大小的方法?
说我有一个矢量,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 - 有更好的方法吗?
答案 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