【问题标题】:R trim blocks in binary vector to only first elementR将二进制向量中的块修剪为仅第一个元素
【发布时间】:2016-06-30 02:34:51
【问题描述】:

假设我有一个像这样的二进制向量(作为数据框中的一列):

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]))
  }
}

有没有更好的方法来实现这一点,而不必遍历数据框并将时间存储在新的数据框中(我只想替换现有的列)?

【问题讨论】:

  • df$step[c(0, diff(df$step)) != 1] &lt;- 0?

标签: r dataframe


【解决方案1】:

我们可以找到向量的差异,并标记正变化,指示从0到1的位置:

res <- c(0,diff(x)==1)

检查答案:

ans <- "000001000000000100000000001000000010000"
ans2 <- paste(res, collapse="")
all.equal(ans, ans2)
#[1] TRUE

【讨论】:

  • 如果x 以一系列1s 开头,这就会失败——我认为(diff(c(0,x)) == 1) + 0 应该这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2015-03-04
  • 2019-05-10
  • 1970-01-01
  • 2012-09-06
  • 2019-11-06
相关资源
最近更新 更多