问题描述
我有一个数据框,我在这里查看不同个人在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))