我正在亲自尝试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';
,但是我不知道如何...
答案 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
序列之间的距离似乎就是您要追求的。我们假设您知道自己始终有0
和1
。
r$values == 0
将针对每个位置评估的结果返回一个带有TRUE
或FALSE
的向量。我们可以直接在r$lengths
中使用它。
rl <- r$lengths[r$values == 0]
rl
## [1] 2 4 6
由于它只是0
和1
,因此我们不需要double
。 integer
个可以正常:
as.integer(rl > 5)
## [1] 0 0 1