【发布时间】:2017-04-06 20:21:15
【问题描述】:
这是一个类似于更大数据集的示例数据框:
Day <- c(1, 2, NA, 3, 4, NA, NA, NA, NA, NA, 1, 2, 3, NA, NA, NA, NA, 1, 2, NA, NA, 3, 4, 5)
y <- rpois(length(Day), 2)
z <- seq(1:length(Day)) + 500
df <- data.frame(z, Day, y)
如果“天”列中有 4 个或更多缺失值 (NA) 的序列,则该序列表示研究中的群组之间存在差距。如果序列中的 NA 少于 4 个,则缺失值仍被视为队列的一部分(例如,第 3 行是队列 1 的一部分,但第 8 行不是)。在示例数据框中,有 3 个群组(群组 1:第 1-5 行,群组 2:第 11-13 行,群组 3:第 18-24 行)。我想添加一列列出队列编号和另一列列出队列研究日。这是我使用的代码:
require(dplyr)
CheckNA <- rle(is.na(df$Day))
CheckNA$values <- CheckNA$lengths >= 4 & CheckNA$values == 1
ListNA <- rep(CheckNA$values, CheckNA$lengths)
df$Co <- rep(c(1, NA, 2, NA, 3), rle(ListNA)$lengths) %>% as.factor()
df <- df %>%
group_by (Co) %>%
mutate(CoDay = seq(Co)) %>%
as.data.frame()
df$CoDay <- ifelse(is.na(df$Co), NA, df$CoDay)
有没有更有效的方法来完成这项任务?我专门寻找代码以避免列出队列编号,因为我的实际数据集将有超过 10 个队列。我目前只列出应该重复的序列:c(1, NA, 2, NA, 3)。
【问题讨论】:
-
这已在代码审查中交叉发布:codereview.stackexchange.com/questions/160059/…
-
我已将其从代码审查中删除。