字符串索引匹配备用1和-1

时间:2016-05-25 15:01:18

标签: r

我正在尝试编写一个函数,它接受一个整数向量并返回索引,其中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

2 个答案:

答案 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