我想创建一个列y
,它反映另一列x
的值,并将相邻值设置为非NA。
我们说我有一个data.frame df
:
df = data.frame('index' = 1:10, 'x' = c(NA, NA, 1, NA, NA, NA, 2, NA, NA, NA))
> df
index x
1 1 NA
2 2 NA
3 3 1
4 4 NA
5 5 NA
6 6 NA
7 7 2
8 8 NA
9 9 NA
10 10 NA
现在我想创建一个列df$y
,它构成一些' context'围绕df$x
中的非NA。具体来说,这些df$x
(这里:1和2)的值适用于它们的索引PLUS之前和索引之后的一个,因此:
> df
index x y
1 1 NA NA
2 2 NA 1
3 3 1 1
4 4 NA 1
5 5 NA NA
6 6 NA 2
7 7 2 2
8 8 NA 2
9 9 NA NA
10 10 NA NA
我试图通过找到" context"的相关起始和结束索引来做到这一点。在1和2附近:
temp_list = sapply(df$index, function(i){
if(!is.na(df$x[i])){
target_index_start = i - 1
target_index_end = i + 1
mini_context_iter = df$x[target_index_start:target_index_end]
} else {
NULL
}
})
...这会返回一个很好的列表。
问题是,这似乎不能处理-1:+1
上下文之外的索引。相关问题是this SO post,但在创建新列之前会停止。
我是如何更准确地解决这个问题的?
答案 0 :(得分:1)
library(tidyverse)
df%>%mutate(y=coalesce(x,lead(x),lag(x)))
index x y
1 1 NA NA
2 2 NA 1
3 3 1 1
4 4 NA 1
5 5 NA NA
6 6 NA 2
7 7 2 2
8 8 NA 2
9 9 NA NA
10 10 NA NA