如何使用距离之间的差异填写NA

问题描述

我有一个数据框,我在这里查看不同个人在4个小时内旅行的距离(以下为简化版)。在某些情况下,距离尚未记录,因此距离列的值为NA。

ID<-rep(c("x1","x2"),each=4)
dist<-c(1,3,NA,6,1,7)
time<-rep(c(1,2,4),times=2)
data<-data.frame(ID,dist)
data
ID times dist
x1     1    1
x1     2    3
x1     3   NA
x1     4    6
x2     1    1
x2     2   NA
x2     3   NA
x2     4    7

我想替换那些NA值,以便在多个NA的情况下,个体覆盖两个已知距离之间相等长度的距离,或者在单个NA的情况下,个体覆盖两个已知距离之间的平均距离。 数据框如下所示:

dist2<-c(1,4.5,5,7)
data2<-data.frame(ID,times,dist2)
data2
ID times dist
x1     1    1
x1     2    3
x1     3   4.5
x1     4    6
x2     1    1
x2     2    3
x2     3    5
x2     4    7

有什么想法吗?我试图创建一个for循环或函数,但是有点卡住了。

解决方法

您可以使用na.approx软件包中的zoo函数:

library(zoo)    
data$dist = na.approx(data$dist)
data

  ID dist
1 x1  1.0
2 x1  3.0
3 x1  4.5
4 x1  6.0
5 x2  1.0
6 x2  3.0
7 x2  5.0
8 x2  7.0

在您的示例中,NA仅出现在位置2或3中,但是如果您在用户的第一个或最后一个位置中有NA个,则您可能需要将na.approx包装在一个group_by通话:

library(dplyr)
data = data %>% 
group_by(ID) %>% 
mutate(dist = na.approx(dist))