r - 根据记录前后的平均值添加缺失数据
问题描述
WT 列的缺失数据编码为-99。我想用 WT 的前一个和下一个值的平均值替换缺失值。
例如,缺失值在时间 =2 和时间 =3 我想计算 Time1+Time4/2 并将其添加到时间 =2 和时间 =3 即 5.5 将被添加到时间 = 2 和 3。它应该对于所有缺失值都相同。
ID TIME WT
1 0 4
1 1 5
1 2 -99
1 3 -99
1 4 6
1 5 9
1 6 12
1 7 -99
1 8 -99
1 9 -99
1 10 -99
1 12 16
1 14 18
1 16 20
解决方案
我在第一行和最后一行添加了缺失值以进行测试:
data <- data.frame(ID=1,TIME=0:16,WT=4:20)
data[c(1,3,4,8,9,10,11,16,17),"WT"] <- -99
一种有点不雅的方法,但您可以先尝试处理丢失第一个和最后一个值的可能性:
data$WT[data$WT == -99] <- NA
missing <- which(is.na(data$WT))
if(1 %in% missing){
data$WT[1] <- head(data$WT[!is.na(data$WT)],1)
}
if(nrow(data) %in% missing){
data$WT[nrow(data)] <- tail(data$WT[!is.na(data$WT)],1)
}
然后,您可以使用此函数找到每次运行 NA 的开始和结束:
get_runs <- function(x){
starts <- which(diff(x) == 1)
y <- rle(x)
len <- y$lengths[y$values==TRUE]
ends <- starts + len+1
return(list(starts=starts,len=len,ends=ends, i=1:length(starts)))
}
r <- get_runs(is.na(data$WT))
最后,遍历缺失值并填充它们:
for(i in r$i){
idx <- seq(r$starts[i]+1,r$ends[i]-1,1)
data$WT[idx] <- (data$WT[r$starts[i]] + data$WT[r$ends[i]])/2
}
data
ID TIME WT
1 1 0 5.0
2 1 1 5.0
3 1 2 6.5
4 1 3 6.5
5 1 4 8.0
6 1 5 9.0
7 1 6 10.0
8 1 7 12.5
9 1 8 12.5
10 1 9 12.5
11 1 10 12.5
12 1 11 15.0
13 1 12 16.0
14 1 13 17.0
15 1 14 18.0
16 1 15 18.0
17 1 16 18.0
推荐阅读
- python-3.x - 有没有一种简单的方法来压缩这段代码?
- c# - do-while 循环(计算器)net.framework 的问题
- node.js - 有没有办法使用 spotify 的 API 获取当前播放时间
- google-cloud-platform - 如何通过 API 获取所有可用镜像的信息以创建 vm 实例
- javascript - 在javascript中将纯文本转换为超链接
- cassandra - 在不停机的情况下添加新的 Cassandra 节点
- laravel - Laravel - 模型类型的多态关系
- c# - 如何在c#winforms中取消停靠和分离停靠在另一个窗体中的窗体
- haskell - GHC.PackageDb.readPackageDb:不合适的类型(没有足够的字节)
- java - 我想做一个物理计算器(运动学和弹丸),但我不知道如何构造它。我应该怎么办?