首页 > 解决方案 > 根据整数向量中数字的顺序出现创建一组指标

问题描述

假设我有一个整数向量

x <- c(10, 1, 1, 4, 10, 10, 7, 7, 7)

我想根据这个向量创建两组指标。对于向量的其余部分,第一个指示符y应等于1只要x == 10,然后等于零。重要的是,它必须忽略10向量中稍后发现的任何附加内容。例如,x上面给出的,我希望

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

而如果

x <- c(10, 10, 10, 1, 1, 5, 10, 7, 9)

然后

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

第二个指标,z应该等于1序列结束后的第一个元素。鉴于上述x向量,我希望输出为:

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

使用一个向量来计算另一个向量是非常好的。鉴于用于计算序列的数字可能出现在向量的后面,因此我无法找到解决此问题的巧妙方法,因此在我的情况下,简单的相等性检查不起作用。

标签: r

解决方案


我们可以rle通过将那些“值”分配给 FALSE 来将不等于第一组 10 的值更改为 0

+(inverse.rle(within.list(rle(x == 10), values[seq_along(values) > 1] <- FALSE)))
#[1] 1 0 0 0 0 0 0 0 0
+(inverse.rle(within.list(rle(x == 10), values[seq_along(values) > 1] <- FALSE)))
#[1] 1 1 1 0 0 0 0 0 0

对于第二种情况,获取位置which并创建一个逻辑向量%in%

library(data.table)
+( seq_along(x) %in% which(rleid(x == 10) > 1)[1])
#[1] 0 1 0 0 0 0 0 0 0

 +( seq_along(x) %in% which(rleid(x == 10) > 1)[1])
#[1] 0 0 0 1 0 0 0 0 0

推荐阅读