r - 从R中的向量中提取交替序列

标签 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)

目标是提取交替的 -1s 和 1s。我想创建一个函数,其中输入向量包含 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 或 -1 出现。 A 的第 16 位和第 17 位的 -1 也因此变为 0。

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

最佳答案

识别非零值的位置:

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,您可以制作wkeep与@alexis_laz 的建议:
wkeep = w[c(TRUE, A[w][-1L] != A[w][-length(w)])]

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

关于r - 从R中的向量中提取交替序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35350336/

相关文章:

r - 将 rgl 与 headless 显示器一起使用

r - 符合IEEE754的不同系统中 float 是否相同?

vector - 如何在不出现错误 "cannot borrow as mutable more than once at a time"的情况下递增向量中的每个数字?

c++,从文件读取到结构,然后读取到 vector (结构被插入 vector 太多次而不是一次)

f# - 如何在 F# 中打印出整个斐波那契数列直到用户输入的值?

sql-server - 如何生成以表的Max Id开头的Sequence

r - 如何使用 Docker 将 Rmarkdown 转换为 HTML?

r - 函数内 enquo() 和 toString() 之间的区别

C++ 将 vector <int> 转换为 vector <double>

javascript - 如何将信息输入到一系列表格中并显示该信息?