从R

时间:2016-02-11 21:25:21

标签: r vector sequence

我的数据如下所示:

A= c(0,0,0,-1,0,0,0,1,1,1,0,0,-1,0,0,-1,-1,1,1,1,-1,0,0,0,-1,0,0,-1,-1,1,1,0,0,0,0,1,-1)

目标是提取交替的-1和1。我想创建一个输入向量包含0,1和-1的函数。理想情况下,输出会吐出所有0并交替-1和1。

例如,上述示例的所需输出为:

 B= c(0,0,0,-1,0,0,0,1,0,0,0,0,-1,0,0,0,0,1,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,-1)

A中第9和第10位的两个1变为0,因为我们只保留第一个或第一个-1。由于这个原因,A的第16和第17位的-1也变为0。

任何人都有很好的想法来制作这样的功能吗?

3 个答案:

答案 0 :(得分:5)

确定非零值的位置:

w = which(A != 0)

对于每次类似值的运行,在A[w]中,取第一个位置:

library(data.table)
wkeep = tapply(w, rleid(A[w]), FUN = function(x) x[1])

将所有其他值设置为零:

# following @alexis_laz's approach
B = numeric(length(A)) 
B[ wkeep ] = A[ wkeep ]

这样,你不必在一个循环中进行比较,我认为R很慢。

rleid来自data.table。使用基数R,您可以使用@ alexis_laz的建议wkeep

wkeep = w[c(TRUE, A[w][-1L] != A[w][-length(w)])]

或者编写自己的rleid,如Josh's answer

答案 1 :(得分:3)

这实际上只是GWarius的伪代码的具体化。 (我已经有了一个结构,但逻辑失败了。)

last1 <- -A[which(A != 0)[1] ] # The opposite of the first non-zero item
for (i in seq_along(A) ){ 
          if( last1==1 &&  A[i]==-1  ){ last1 <- -1
          } else {if (last1 == -1 && A[i] == 1) { last1 <- 1
                 } else {A[i] <- 0}} }
 A
 [1]  0  0  0 -1  0  0  0  1  0  0  0  0 -1  0  0  0  0  1  0  0 -1  0  0
[24]  0  0  0  0  0  0  1  0  0  0  0  0  0 -1

> identical(A, B)
[1] TRUE

答案 2 :(得分:2)

你必须滑动所有数组并使用标志变量检查以前是否找到1或-1。 它可能是伪代码算法:

typename