我似乎不太清楚标题的表述。
这是一个显示预期结果的快速示例! 如您所见,我可以自己解决问题,但是当向量很大时,代码效率很低。有没有更聪明的方法(肯定有)?
input_data=c(1,1,1,3,5,5,5,10,10,10,10,11,15,15,15,15,15,8,9)
expected_result=rep(TRUE,length(input_data))
for (k in 1:(length(input_data)-2)) {
if (input_data[k]==input_data[k+1] & input_data[k+1]==input_data[k+2]) {
expected_result[k+1]=FALSE
}
}
print(expected_result)
谢谢!
答案 0 :(得分:1)
data.table方法
代码
library( data.table )
data.table( input = input_data )[, output := ifelse( input == shift( input, type = "lead", fill = FALSE) & input == shift( input, type = "lag", fill = FALSE), TRUE, FALSE)][[2]]
输出
#[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE
功能
根据向量data.table
创建一个input_data
。
检查上一个和下一个值是否等于当前值(使用shift
)。
如果上一个和下一个与光标相同,则将缺失的值(第一个和最后一个)填充为FALSE,结果= TRUE,否则,结果为FALSE。
将结果写入新的列名output
[[2]]
会将新创建的输出列导出为矢量。
答案 1 :(得分:1)
向量解
n <- length(input_data)
v0 <- input_data[1:(n-2)]
v1 <- input_data[2:(n-1)]
v2 <- input_data[3:n]
expected_result <- c(TRUE,!((v0==v1)&(v1==v2)),TRUE)
并且要真正最小化
n <- length(input_data)
expected_result <- c(TRUE,!((diff(input_data[-n])==0)&(diff(input_data[-1])==0)),TRUE)
请注意,您实际上从未检查过第一个或最后一个值是否需要从初始TRUE
开始进行更新,因此TRUE
的两端都会被填充。