从R中的载体中提取交替序列

jay*_*020 4 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)
Run Code Online (Sandbox Code Playgroud)

目标是提取交替的-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)
Run Code Online (Sandbox Code Playgroud)

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

任何人都有一个好主意做这样的功能?

Fra*_*ank 5

确定非零值的位置:

w = which(A != 0)
Run Code Online (Sandbox Code Playgroud)

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

library(data.table)
wkeep = tapply(w, rleid(A[w]), FUN = function(x) x[1])
Run Code Online (Sandbox Code Playgroud)

将所有其他值设置为零:

# following @alexis_laz's approach
B = numeric(length(A)) 
B[ wkeep ] = A[ wkeep ]
Run Code Online (Sandbox Code Playgroud)

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


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

wkeep = w[c(TRUE, A[w][-1L] != A[w][-length(w)])]
Run Code Online (Sandbox Code Playgroud)

或者rleidJosh的回答一样写自己.

  • 在同样的方法:`w =哪(A!= 0L); wkeep = w [c(TRUE,A [w] [ - 1L]!= A [w] [ - length(w)])]; ans =数字(长度(A)); ans [wkeep] = A [wkeep]; ans` (2认同)