为向量元素分配与先前匹配值相关的值

时间:2019-07-11 14:24:25

标签: r vector match apply

我有一个TRUEFALSE值交替的向量:

dat <- c(T,F,F,T,F,F,F,T,F,T,F,F,F,F)

我想用唯一的序列号为TRUE的每个实例编号,并为每个FALSE值分配与前面的TRUE值关联的编号。

因此,使用上面的示例dat(具有4个TRUE值),我期望的输出:

1 1 1 2 2 2 2 3 3 4 4 4 4 4 

我尝试过的事情

我已经尝试了以下方法(有效),但是我知道必须有一个更简单的解决方案!

whichT <- which(dat==T)
whichF <- which(dat==F)

l1 <- lapply(1:length(whichT),
  FUN = function(x) 
    which(whichF > whichT[x] & whichF < whichT[(x+1)]) 
)

l1[[length(l1)]] <- which(whichF > whichT[length(whichT)])

replaceFs <- unlist(
  lapply(1:length(whichT), 
    function(x) l1[[x]] <- rep(x,length(l1[[x]]))
  )
)

replaceTs <- 1:length(whichT)

dat2 <- dat
  dat2[whichT] <- replaceTs
  dat2[whichF] <- replaceFs

dat2
 [1] 1 1 1 2 2 2 2 3 3 4 4 4 4 4

我需要一个更简单,更快捷的解决方案b / c,我的真实数据集的长度为181k行!

首选Base R解决方案,但任何解决方案都可以

3 个答案:

答案 0 :(得分:2)

使用cumsum中的base R可以轻松完成索引工作。在这里,TRUE/FALSE被强制为1/0,当我们进行累加总和时,无论有1是多少,它都会加1

cumsum(dat)
#[1] 1 1 1 2 2 2 2 3 3 4 4 4 4 4

答案 1 :(得分:2)

cumsum(dat)将做您想要的。在数学函数中使用时,TRUE会转换为1,而FALSE会转换为0,因此,每次看到TRUE时,取累加总和将加1,而当您想要的FALSE时则不添加任何东西。

dat <- c(T,F,F,T,F,F,F,T,F,T,F,F,F,F)
cumsum(dat)
# [1] 1 1 1 2 2 2 2 3 3 4 4 4 4 4

答案 2 :(得分:2)

cumsum()是最简单的方法,但是,您也可以这样做:

Reduce("+", dat, accumulate = TRUE)

 [1] 1 1 1 2 2 2 2 3 3 4 4 4 4 4