gpt4 book ai didi

r - 使用 dplyr 进行线性插值

转载 作者:行者123 更新时间:2023-12-04 16:43:52 26 4
gpt4 key购买 nike

我正在尝试使用 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


看来 dplyrxts 不兼容/ zoo我花了几个小时四处寻找有关如何在 R 中插入缺失数据点的教程/示例,但我发现的只是单个案例示例,到目前为止,我一直无法找到有关如何插入缺失数据点的任何内容为多人的多个站点执行此操作(我意识到我可以通过将我的数据 reshape 为广泛的数据来使其成为多人问题,但这仍然不能解决我遇到的问题)。
任何关于如何进行的想法/建议/见解将不胜感激。
谢谢
编辑:澄清一些功能来自 zoo包裹。

最佳答案

使用 approx()线性插值函数:

df %>%
group_by(variable) %>%
arrange(variable, event.date) %>%
mutate(time=seq(1,n())) %>%
mutate(ip.value=approx(time,value,time)$y) %>%
select(-time)

spline非线性插值函数:
df %>%
group_by(variable) %>%
arrange(variable, event.date) %>%
mutate(time=seq(1,n())) %>%
mutate(ip.value=spline(time,value ,n=n())$y) %>%
select(-time)

关于r - 使用 dplyr 进行线性插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27920690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com