我正在处理一个数据集,该数据集是基于从临床记录中收集的数据计算出来的分数。在某些情况下,这些数据被省略,因此无法计算分数,并将其记录为NA。
在某些情况下,我能够用之前的值替换NA值。这种方法的限制如下:
如果分数为NA,则检查前面和后面的值是否为NA。如果前面和后面的值都不是NA,则插入这些分数的平均值。
如果分数为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。