我有一个数据框,其中包含与观察值相关的值,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
答案 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
一个班轮,使用事实观察只包含0
和1
,并结合矢量化操作:
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