R中的数据帧累积运行长度编码

时间:2015-05-15 02:25:06

标签: r dataframe

我有一个数据框,其中包含与观察值相关的值,1或0.我想计算连续出现的1,重置为0.运行长度编码函数(rle)似乎它可以完成工作,但我无法将数据转换为所需的格式。我想在不编写自定义函数的情况下尝试这样做。在下面的数据中,我在数据框中观察,然后我想得到"连续的"列并写回数据帧。此链接为good start

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

5 个答案:

答案 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

答案 1 :(得分:7)

使用the devel version,您可以尝试

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

答案 2 :(得分:4)

可能有更好的方法,但是:

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

答案 3 :(得分:3)

只需根据您关联的问题调整已接受的答案:

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

答案 4 :(得分: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