繁体   English   中英

在不适用时插值

[英]Interpolating when there's NA's

我的纵向数据结构如下(在R中 ):

dat1 <- data.frame(county = c("a","a","a", "b","b","b", "c","c","c"), year = c(2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003), count = c(2, NA, 6, 4, NA, 8, 10, NA, 14))

我想对2002年进行插值,这是我想念的一年。 我做了一个函数来做:

dat1[dat1$year == 2002,] <- apply(X = data.frame("2001" = dat1[dat1$year == 2001, "count"], "2003" = dat1[dat1$year == 2003, "count"]), MARGIN = 1, FUN = function(x){z <- data.frame(approx(x = x, method = "linear", n = length(2001:2003))$y); return(z[-c(1, nrow(z)),])})
dat1 # the desired result

但是它仅在我用于插值的两年中没有任何NA的情况下才有效:

dat2 <- dat1
dat2[9,3] <- NA

apply(X = data.frame("2001" = dat2[dat2$year == 2001, "count"], "2003" = dat2[dat2$year == 2003, "count"]), MARGIN = 1, FUN = function(x){z <- data.frame(approx(x = x, method = "linear", n = length(2001:2003))$y); return(z[-c(1, nrow(z)),])})

我知道我可以只使用complete.cases()使其运行,但是由于行长会有所不同,因此我无法将其重新插入到原始数据框中。

是否有人可以解决我之前或之后几年的NA问题,或者可以更好地解决我的狂妄尝试?

如果只有NA,则返回NA;如果只有一个非NA,则使用na.approx将每个NA替换为单个非NA na.aggregate如果一个县中有多个NA,则使用na.approx

library(zoo)

na_approx <- function(x) {
    if (all(is.na(x))) NA 
    else if (sum(!is.na(x)) == 1) na.aggregate(x)
    else na.approx(x, na.rm = FALSE)
}
transform(dat2, count = ave(count, county, FUN = na_approx))

给予:

  county year count
1      a 2001     2
2      a 2002     4
3      a 2003     6
4      b 2001     4
5      b 2002     6
6      b 2003     8
7      c 2001    10
8      c 2002    10
9      c 2003    10

尽管在此示例中给出的结果相同,但这是一种可能具有稍微不同的行为的替代方法。

na_approx2 <- function(x) {
     if (sum(!is.na(x)) > 1) na.approx(x, na.rm = FALSE) 
     else na.locf(x, na.rm = FALSE)
}
transform(dat2, count = ave(count, county, FUN = na_approx2))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM