首页 > 解决方案 > 有效地确定与条目相同的值包围的向量的条目

问题描述

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

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

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)

提前致谢!

标签: rvectorsubset

解决方案


数据表方法

代码

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]]是将新创建的输出列导出为向量。


推荐阅读