我有一个TRUE
和FALSE
值交替的向量:
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解决方案,但任何解决方案都可以
答案 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