我正在尝试编写一个函数,它接受一个整数向量并返回索引,其中1和-1交替。我认为这将是一个简单的功能,但它证明非常难以编写!
示例:
notifyDatasetChanged()
我的(非工作)尝试:
index: 1 2 3 4 5 6 7 8 9 10
string: 1 0 0 0 1 -1 -1 0 1 -1 #this is input to function
returns index of -1 and 1 so that -1 index is listed first
[6,1] #from 1 to -1
[6,9] #from -1 to 1
[10,9] #from 1 to -1
答案 0 :(得分:2)
一种方法是交替迭代1
和-1
的索引并逐步保存索引。
有:
x = c(1, 0, 0, 0, 1, -1, -1, 0, 1, -1)
并计算指数:
i1 = which(x == 1)
i2 = which(x == -1)
递归地找到渐进序列:
ff = function(x, y, acc = integer())
{
if(!length(x)) return(acc)
if(!length(y)) return(c(acc, x[[1L]]))
Recall(y[(findInterval(x[[1L]], y) + 1L):length(y)], x[-1L], c(acc, x[[1L]]))
}
ans = if(i1[[1]] < i2[[1]]) ff(i1, i2) else ff(i2, i1)
ans
#[1] 1 6 9 10
获得准确的所需输出(以其他方式):
tmp = embed(ans, 2)
i = (seq_len(nrow(tmp)) %% 2) == (if(i1[[1]] < i2[[1]]) 0 else 1)
tmp[i, ] = t(apply(tmp[i, , drop = FALSE], 1, rev))
tmp
# [,1] [,2]
#[1,] 6 1
#[2,] 6 9
#[3,] 10 9
测试其他数据:
X = c(0, 0, -1, 0, 0, -1, 1, 1, 1, -1, -1, 0, 0, -1, 0, 0, 1, -1,
-1, -1, 0, 1, 0, 1, 1, 1, -1, 0, 0, 1, 0, 1, 0, -1, 1, 1, 1,
-1, 0, 0, 1, 0, 1, 0, -1, 1, 1, 1)
i1 = which(X == 1)
i2 = which(X == -1)
if(i1[[1]] < i2[[1]]) ff(i1, i2) else ff(i2, i1)
# [1] 3 7 10 17 18 22 27 30 34 35 38 41 45 46
#..and proceed as necessary
答案 1 :(得分:2)
这是一个不完整的答案,但我认为这是正确的方向。
测试用例:
x <- c(1,0,0,0,1,-1,-1,0,1)
我们基本上想要忽略零值,所以让我们(1)用NA
替换它们,(2)用zoo::na.locf
(“最后一次观察结转”)用前导值替换它们
x2 <- x
x2[x2==0] <- NA
x2 <- zoo::na.locf(x2)
现在使用rle()
来识别运行/断点:
(r <- rle(x2))
## Run Length Encoding
## lengths: int [1:3] 5 3 1
## values : num [1:3] 1 -1 1
以下陈述给出了(6,9,10)您感兴趣的位置:r$values
给出了有关切换方向的相应信息
cumsum(r$lengths)+1