向量的diff函数

时间:2018-11-18 13:08:49

标签: r diff cumsum

我正在亲自尝试R studio,并有一个问题。 我有一个向量

0 0 1

我想使函数执行以下操作:如果两个1的子序列之间的距离小于5,则它将显示0。但是如果大于5,它将显示1。

所以,如果看

function_start_of_seq <- function(x) {

  one_pos<-which(rle(x)$values==1 %in% TRUE)

输出将是:

diff

我了解如何找到1:

cumsum

我知道我需要使用console.log(new Date(startDate)).toISOString(); console.log(new Date(endDate)).toISoString(); 函数和Current Output: // startDate=2018-11-01T00:00:00.000Z //endDate=2018-12-01T00:00:00.000Z Expected // StartDate=20181101T000000 // endDate=20181201T0000000'; ,但是我不知道如何...

2 个答案:

答案 0 :(得分:2)

也许相对于0而不是1的方法更合适。在下一行中,您可以检查rle()输出的长度,该距离(即0之间的1的数量)超过了5。只需将其转换为{{1} },结尾为0-1

as.numeric()

这有意义吗?

如果您想要单线,只需做

fun1 <- function(x) {
  null_pos <- which(rle(x)$values == 0)
  tf <- rle(x)$lengths[null_pos] > 5
  return(as.numeric(tf))
}

> fun1(vec)
[1] 0 0 1

部分> as.numeric(rle(vec)$lengths[which(rle(vec)$values == 0)] > 5) [1] 0 0 1 选择which(rle(vec)$values == 0)个序列之间的距离(即,1关于rle()的输出)大于0的位置

5然后将输出“转换”为as.numeric()-您想要的形式。

答案 1 :(得分:1)

一个不酷,不混淆,只能打电话的rle一次,不使用which的答案:

vec <- c(1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1)

r <- rle(vec)
r
## Run Length Encoding
##   lengths: int [1:7] 1 2 2 4 1 6 1
##   values : num [1:7] 1 0 1 0 1 0 1

所以1序列之间的距离似乎就是您要追求的。我们假设您知道自己始终有01

r$values == 0将针对每个位置评估的结果返回一个带有TRUEFALSE的向量。我们可以直接在r$lengths中使用它。

rl <- r$lengths[r$values == 0]
rl
## [1] 2 4 6

由于它只是01,因此我们不需要doubleinteger个可以正常

as.integer(rl > 5)
## [1] 0 0 1