2015-05-15 42 views
3

我有一个数据帧,其中包含与观察值1或0有关的值。我想计算1的连续出现次数,重置为0.运行长度编码函数(rle)似乎它会做这项工作,但我无法将数据转换为所需的格式。我想在不编写自定义函数的情况下尝试这样做。在下面的数据中,我观察了一个数据框,然后我想导出“连续”列并写回数据框。此链接是good startR中的数据帧累积游程长度编码

observation continual 
      0   0 
      0   0 
      0   0 
      1   1 
      1   2 
      1   3 
      1   4 
      1   5 
      1   6 
      1   7 
      1   8 
      1   9 
      1  10 
      1  11 
      1  12 
      0   0 
      0   0 

回答

7

您可以在几个步骤做到这一点很容易:

x <- rle(mydf$observation)  ## run rle on the relevant column 
new <- sequence(x$lengths)  ## create a sequence of the lengths values 
new[mydf$observation == 0] <- 0 ## replace relevant values with zero 
new 
# [1] 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 0 0 
4

有可能是一个更好的办法,但:

g <- c(0,cumsum(abs(diff(df$obs)))) 
df$continual <- ave(g,g,FUN=seq_along) 
df$continual[df$obs==0] <- 0 
7

使用the devel version你可以尝试

library(data.table) ## v >= 1.9.5 
setDT(df)[, continual := seq_len(.N) * observation, by = rleid(observation)] 
+0

这不会当它达到0时重置。 –

+4

@Frank,Steve是对的,你的编辑无效。这是'.I'实际工作的最大秘诀之一。 –

3

只需调整ac从你链接的问题cepted答案:

unlist(mapply(function(x, y) seq(x)*y, rle(df$obs)$lengths, rle(df$obs)$values)) 
# [1] 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 0 0 
2

您可以使用一个简单的基本R一个衬垫,用事实观察只包含01,再加上量化操作:

transform(df, continual=ifelse(observation, cumsum(observation), observation)) 

# observation continual 
#1   0   0 
#2   0   0 
#3   0   0 
#4   1   1 
#5   1   2 
#6   1   3 
#7   1   4 
#8   1   5 
#9   1   6 
#10   1   7 
#11   1   8 
#12   1   9 
#13   1  10 
#14   1  11 
#15   1  12 
#16   0   0 
#17   0   0 
+1

如果有额外的运行,这是否工作?这有点模糊,但我在想“我要计数1的连续出现次数,重置为0” – Frank

+1

真的!我会做'序列(rle(df1 $观察)$长度)',但这与@Aranda完全相似,除了我以更紧凑的方式放置代码。 –