我有一个如下所示的数据:
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,您可以使用@alexis_laz 的建议制作 wkeep
:wkeep = w[c(TRUE, A[w][-1L] != A[w][-length(w)])]
或者编写您自己的
rleid
,如 Josh's answer 。关于r - 从R中的向量中提取交替序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35350336/