我有一个包含不同传感器测量值的时间序列数据集。传感器软件存在一些错误,导致缺少测量值。我添加了缺少的测量时间,从而在“值”列中生成了NA。数据集如下所示:
df <- structure(list(time_id = 1:10, value = c(-1.80603125680195, -0.582075924689333,
NA, NA, -0.162309523556819, NA, NA, NA, 1.6059096288573, NA),
is_missing = c(FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE,
TRUE, FALSE, TRUE)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -10L))
df
我想用数字值和缺失值对顺序行进行分组,并同时计算每个组中顺序行的数量。结果应如下所示:
df %>% mutate(group = c(1, 1, 2, 2, 3, 4, 4, 4, 5, 6),
seq_NA = c(1:2, 1:2, 1, 1:3, 1, 1))
非常感谢您的帮助!
答案 0 :(得分:2)
这是另一个想法。这里,我们使用is.na()
来捕获NA并在出现非NA时(即
df %>%
group_by(grp = cumsum(c(1, diff(is.na(value)) != 0))) %>%
mutate(seq_NA = seq(n()))
给出,
# A tibble: 10 x 5 # Groups: grp [6] time_id value is_missing grp seq_NA <int> <dbl> <lgl> <dbl> <int> 1 1 -1.81 FALSE 1 1 2 2 -0.582 FALSE 1 2 3 3 NA TRUE 2 1 4 4 NA TRUE 2 2 5 5 -0.162 FALSE 3 1 6 6 NA TRUE 4 1 7 7 NA TRUE 4 2 8 8 NA TRUE 4 3 9 9 1.61 FALSE 5 1 10 10 NA TRUE 6 1
答案 1 :(得分:1)
这是使用ave()
+ rle()
df$group <- with(df, rep(seq_along(z<-rle(is_missing)$lengths),z))
df$seq_NA <- with(df,ave(seq(nrow(df)),group,FUN = seq_along))
这样
> df
time_id value is_missing group seq_NA
1 1 -1.8060313 FALSE 1 1
2 2 -0.5820759 FALSE 1 2
3 3 NA TRUE 2 1
4 4 NA TRUE 2 2
5 5 -0.1623095 FALSE 3 1
6 6 NA TRUE 4 1
7 7 NA TRUE 4 2
8 8 NA TRUE 4 3
9 9 1.6059096 FALSE 5 1
10 10 NA TRUE 6 1