繁体   English   中英

在向量中找到最接近的匹配项以使用dplyr填充缺失值

[英]find closest match within a vector to fill missing values using dplyr

虚拟数据集为:

data <- data.frame(
  group = c(1,1,1,1,1,2),
  dates = as.Date(c("2005-01-01", "2006-05-01", "2007-05-01","2004-08-01",
            "2005-03-01","2010-02-01")),
  value = c(10,20,NA,40,NA,5)
)

对于每个group ,需要用与同一组中最近的日期相对应的非缺失值来填充缺失值。 如果是平局,选择任何一个。

我正在使用dplyr which.closest from birk但它需要一个向量和一个值。 如何在向量内查找而不编写循环。 即使有SQL解决方案,也可以。 有解决方案的指针吗?

可能类似于: value = value[match(which.closest(dates,THISdate) & !is.na(value))]不知道如何指定Thisdate

编辑:期望值向量应如下所示:

value = c(10,20,20,40,10,5)

使用类包(R附带的knn1 (最近邻居)-不需要安装)和dplyr定义na.knn1函数,该函数将x每个NA值替换为最接近的non-NA xtime

library(class)

na.knn1 <- function(x, time) {
   is_na <- is.na(x)
   if (sum(is_na) == 0 || all(is_na)) return(x)
   train <- matrix(time[!is_na])
   test <- matrix(time[is_na])
   cl <- x[!is_na]
   x[is_na] <- as.numeric(as.character(knn1(train, test, cl)))
   x
}

data %>% mutate(value = na.knn1(value, dates))

赠送:

  group      dates value
1     1 2005-01-01    10
2     1 2006-05-01    20
3     1 2007-05-01    20
4     1 2004-08-01    40
5     1 2005-03-01    10
6     2 2010-02-01     5

如果打算按组执行此操作,请添加适当的group_by

您可以尝试使用sapply来查找最接近的值,因为`which.closest中的x参数仅包含一个值。

首先创建一个vect ,将没有值的日期替换为NA ,并在which.closest函数中使用它。

library(birk)
vect=replace(data$dates,which(is.na(data$value)),NA)
transform(data,value=value[sapply(dates,which.closest,vec=vect)])
  group      dates value
1     1 2005-01-01    10
2     1 2006-05-01    20
3     1 2007-05-01    20
4     1 2004-08-01    40
5     1 2005-03-01    10
6     2 2010-02-01     5

如果which.closest是一个向量,则不需要sapply 但这种情况并非如此。
使用dplyr软件包:

library(birk)
library(dplyr)
data%>%mutate(vect=`is.na<-`(dates,is.na(value)),
              value=value[sapply(dates,which.closest,vect)])%>%
     select(-vect)

暂无
暂无

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

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