gpt4 book ai didi

r - 计算包含 NA 值的序列

转载 作者:行者123 更新时间:2023-12-04 11:34:25 25 4
gpt4 key购买 nike

这是一个类似于更大数据集的示例数据框:

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)

如果 Day 列中有 4 个或更多缺失值 (NA) 的序列,则该序列表示研究中队列之间的差距。如果序列中少于 4 个 NA,则缺失值仍被视为队列的一部分(例如,第 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) .

最佳答案

我会在这里做出改变

CheckNA        <- rle(is.na(df$Day))
CheckNA$values <- CheckNA$lengths >= 4 & CheckNA$values == 1
CheckNA$values <- ifelse(!CheckNA$values, cumsum(CheckNA$values)+1, NA)
df$Co <- inverse.rle(CheckNA)

我保持前两行相同,然后我使用 cumsum()在每次休息时分配新的 ID。这意味着您不必对任何值进行硬编码。使用新值,您可以使用 inverse.rle与您使用 rep() 的方式大致相同将新 ID 扩展到每一行。

如果你把它变成一个函数,你可以清理 dplyr
id_NA_break <- function(x) {
CheckNA <- rle(is.na(x))
CheckNA$values <- CheckNA$lengths >= 4 & CheckNA$values == 1
CheckNA$values <- ifelse(!CheckNA$values, cumsum(CheckNA$values)+1, NA)
inverse.rle(CheckNA)
}

df <- data.frame(z, Day, y)
df %>%
mutate(Co=id_NA_break(Day)) %>%
group_by(Co) %>%
mutate(CoDay = ifelse(is.na(Co), NA, seq(Co)))

关于r - 计算包含 NA 值的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com