如何将距离归结为一个值

Dan*_*dge 12 r imputation

我想用"行距离"填充缺失值到最近的非NA值.换句话说,如何将此示例数据框中的列x转换为y列?

#    x y
#1   0 0
#2  NA 1
#3   0 0
#4  NA 1
#5  NA 2
#6  NA 1
#7   0 0
#8  NA 1
#9  NA 2
#10 NA 3
#11 NA 2
#12 NA 1
#13  0 0
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到dplyr group_by和mutate row_number()语句的正确组合来完成这个技巧.我调查过的各种插补包都是针对更复杂的场景而设计的,其中使用统计和其他变量进行插补.

d<-data.frame(x=c(0,NA,0,rep(NA,3),0,rep(NA,5),0),y=c(0,1,0,1,2,1,0,1,2,3,2,1,0))
Run Code Online (Sandbox Code Playgroud)

dww*_*dww 5

我们可以用

d$z = sapply(seq_along(d$x), function(z) min(abs(z - which(!is.na(d$x)))))
#     x y z
# 1   0 0 0
# 2  NA 1 1
# 3   0 0 0
# 4  NA 1 1
# 5  NA 2 2
# 6  NA 1 1
# 7   0 0 0
# 8  NA 1 1
# 9  NA 2 2
# 10 NA 3 3
# 11 NA 2 2
# 12 NA 1 1
# 13  0 0 0
Run Code Online (Sandbox Code Playgroud)

如果你想在dplyr中这样做,你可以将sapply部分包装成一个mutate.

d %>%
   mutate(z = sapply(seq_along(x), function(z) min(abs(z - which(!is.na(x))))))
Run Code Online (Sandbox Code Playgroud)

或者,也使用library(purrr)(感谢@Onyambu):

d %>% mutate(m=map_dbl(1:n(),~min(abs(.x-which(!is.na(x))))))
Run Code Online (Sandbox Code Playgroud)