假设我有一个像这样的二进制矢量(作为数据帧中的一列):
000001111111000111100000001111000011111
我想取每个1的块,并用0代替整个块只保留1的第一个实例:
000001000000000100000000001000000010000
目前我正在使用我认为非常低效的方法来做这个,并且该方法只是部分完成。我循环遍历数据帧的每一行并检查块开始,然后将与起始1相关的索引/时间存储在新数据帧中:
stepStarts = data.frame()
for (i in 2:nrow(df)) {
if(df$step[i] == 1 & df$step[i-1] == 0){
stepStarts <- rbind(stepStarts, data.frame(trialNum = df$trialNum[i], stepTime = df$time[i]))
}
}
有没有更好的方法来实现这一点,而无需循环数据框,并将时间存储在新的数据框中(我只想替换现有的列)?
答案 0 :(得分:1)
我们可以找到向量的差异并标记正向变化,指示0导致1:
res <- c(0,diff(x)==1)
检查答案:
ans <- "000001000000000100000000001000000010000"
ans2 <- paste(res, collapse="")
all.equal(ans, ans2)
#[1] TRUE