有效确定向量的项,该向量的值与该项相同

时间:2019-02-08 12:27:22

标签: r vector subset

我似乎不太清楚标题的表述。

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

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)

谢谢!

2 个答案:

答案 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的两端都会被填充。