【发布时间】:2021-06-08 14:11:45
【问题描述】:
我正在尝试使用 zoo 库中的 na.approx() 函数(与 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()
xts(., .$value, .$event.date) 中的错误:order.by 需要适当的基于时间的对象
似乎dplyr 与xts/zoo 配合得不好,我花了几个小时四处寻找有关如何在 R 中插入缺失数据点的教程/示例,但是我发现的只是单个案例,到目前为止,我还没有找到任何关于如何为多人的多个站点执行此操作的任何内容(我意识到我可以通过将我的数据重塑为广泛但仍然无法解决我遇到的问题)。
任何关于如何进行的想法/建议/见解将不胜感激。
谢谢
编辑:澄清一些功能来自zoo 包。
【问题讨论】:
-
我不熟悉
xts,但也许你正在寻找这个:df %>% group_by(variable) %>% arrange(variable, event.date) %>% mutate(value = na.approx(value))其中 na.approx 来自 zoo 包。如果您想使用 dplyr 修改列,通常在mutate调用中进行,或者,如果您有任意函数,在do调用中进行。 -
AFAIK,xts 中没有
na.approx功能(刚安装) -
@slackline,我第一条评论中的代码是否符合您的预期?
-
@docendodiscimus 是的,这个简化的例子看起来很有希望,我会用我更大的数据框来调查它(愚蠢的是我已经知道
mutate(),但没有考虑添加列到我现有的数据框,而不是针对具有估算值的单独数据框以适应我的其余工作流程)。 -
@docendodiscimus @shadow 是的,我很抱歉,我将来自
xts的命令与来自zoo的命令混为一谈(读到xts扩展了zoo中的时间序列函数让我感到困惑)