我正在尝试使用库中na.approx()
的zoo
函数(与结合使用xts
)对多个测量值的多个个体的重复测量数据中的缺失值进行插值。
样本数据...
event.date <- c("2010-05-25", "2010-09-10", "2011-05-13", "2012-03-28", "2013-03-07",
"2014-02-13", "2010-06-11", "2010-09-10", "2011-05-13", "2012-03-28",
"2013-03-07", "2014-02-13")
variable <- c("neck.bmd", "neck.bmd", "neck.bmd", "neck.bmd", "neck.bmd", "neck.bmd",
"wbody.bmd", "wbody.bmd", "wbody.bmd", "wbody.bmd", "wbody.bmd", "wbody.bmd")
value <- c(0.7490, 0.7615, 0.7900, 0.7730, NA, 0.7420, 1.0520, 1.0665, 1.0760,
1.0870, NA, 1.0550)
## Bind into a data frame
df <- data.frame(event.date, variable, value)
rm(event.date, variable, value)
## Convert date
df$event.date <- as.Date(df$event.date)
## Load libraries
library(magrittr)
library(xts)
library(zoo)
我可以使用xts()
和na.approx()
...为给定的人为单个结果插值一个缺失的数据点。
## Subset one variable
wbody <- subset(df, variable == "wbody.bmd")
## order/index and then interpolate
xts(wbody$value, wbody$event.date) %>%
na.approx()
2010-06-11 1.052000
2010-09-10 1.066500
2011-05-13 1.076000
2012-03-28 1.087000
2013-03-07 1.070977
2014-02-13 1.055000
返回矩阵不理想,但是我可以解决这个问题。不过,我的主要问题是,对于多个人来说,我有多种结果。我可能天真地认为,由于这是一个拆分应用组合问题,因此我可以dplyr
通过以下方式利用它来实现这一目标...
## Load library
library(dplyr)
## group and then arrange the data (to ensure dates are correct)
df %>%
group_by(variable) %>%
arrange(variable, event.date) %>%
xts(.$value, .$event.date) %>%
na.approx()
Error in xts(., .$value, .$event.date) : order.by requires an appropriate time-based object
似乎dplyr
不能很好地与xts
/配合使用,zoo
并且我花了几个小时进行搜索,以查找有关如何对R中缺少的数据点进行插值的教程/示例,但是到目前为止,我发现的只是单个案例的示例我一直无法找到有关如何为多个人在多个站点上执行此操作的任何信息(我意识到可以通过将数据重塑为更广泛的范围来解决多人问题,但这仍然无法解决我遇到的问题)。
任何有关如何进行的想法/建议/见解将不胜感激。
谢谢
编辑:澄清某些功能来自zoo
程序包。
我所使用的解决方案基于@docendodiscimus的第一条评论
无需像我一直在尝试的那样创建新的数据框,而是利用dplyr
的mutate()
功能,只需在现有数据框中添加列即可。
我的代码现在是...
df %>%
group_by(variable) %>%
arrange(variable, event.date) %>%
mutate(ip.value = na.approx(value, maxgap = 4, rule = 2))
该maxgap
允许高达四个连续NA
的,而rule
选项允许外推到侧翼的时间点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句