【问题标题】:Efficiently determine entries of a vector surrounded by the same value as the entry有效地确定与条目相同的值包围的向量的条目
【发布时间】:2025-11-28 02:30:01
【问题描述】:

我似乎无法很好地制定标题。

这是一个显示预期结果的简单示例! 如您所见,我可以自己解决问题,但是当我觉得向量很大时,代码效率非常低。有没有更聪明的方法(肯定有)?

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)

提前致谢!

【问题讨论】:

    标签: r vector subset


    【解决方案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
    

    功能

    从向量input_data创建一个data.table
    检查上一个值和下一个值是否等于当前值(使用shift)。
    如果上一个和下一个与当前相同,则将缺失值(第一个和最后一个)填充为 FALSE,结果 = TRUE 否则,结果为 FALSE。
    将结果写入新列名称output
    [[2]] 是将新创建的输出列导出为向量。

    【讨论】:

    • 谢谢@JoelH。当速度成为问题,或处理大量数据时,data.table 始终是一个值得考虑的好方案。
    【解决方案2】:

    向量解,

    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 更新,因此 TRUEs 会在两端填充。

    【讨论】: