【发布时间】:2019-10-17 15:24:44
【问题描述】:
我正在研究一个数据集,其中根据从临床记录中收集的数据计算得分。在某些情况下,此数据已被省略,因此无法计算分数并记录为 NA。
在某些情况下,我可以用以前的值替换 NA 值。这种方法的局限性在于:
如果 score 为 NA,则检查上一个值和下一个值是否为 NA。如果前一个值和下一个值都不是 NA,则插入这些分数的平均值。
如果 score 为 NA,则检查上一个值和下一个值是否为 NA。如果只有前一个值不是 NA,则用前一个值替换第一个 NA 值。
如果顺序有两个或多个NA值,只替换第一个NA值,其余的为NA。
我已经尝试过函数 zoo::na.locf() 但这会不加选择地替换所有 NA 或限制替换大于多个 NA 的间隙。
我查看了 tidy fill,但文档没有包含任何关于设置填充限制的内容。
对于以下数据:
ID,episode,score
1,1,1
1,2,1
1,3,1
1,4,NA
1,5,NA
1,6,NA
1,7,2
1,8,NA
1,9,4
1,10,NA
2,1,NA
2,2,2
2,3,3
2,4,4
2,5,NA
2,6,NA
2,7,3
2,8,NA
2,9,NA
2,10,NA
所以我认为我在下面嵌套的 ifelse mutate 上走在了正确的轨道上,但我缺少有关可用于将替换限制为特定数量的 NA 值的函数的知识
data <- data %>%
group_by(ID) %>%
arrange(episode) %>%
mutate(score = ifelse(is.na(score) & lag(!is.na(score)) & lead(!is.na(score)), average(sum(lag(score),lead(score))),
ifelse(is.na(score) & lag(!is.na(score)) & lead(is.na(score)), lag(score), ...) #And this is where I get stuck as I am unsure how to code for NA runs greater than 1
我的预期输出是:
ID,episode,score
1,1,1
1,2,1
1,3,1
1,4,*1
1,5,NA
1,6,NA
1,7,2
1,8,*3
1,9,4
1,10,*4
2,1,NA
2,2,2
2,3,3
2,4,4
2,5,*4
2,6,NA
2,7,3
2,8,*3
2,9,NA
2,10,NA
*s 添加以明确复制值的位置。
【问题讨论】:
标签: r