我希望用最近日期的非NA值填充表中的缺失值,无论是参考日期之前还是之后。这意味着一个表,如:
date value
03.03.2023 1
04.03.2023 NA
06.03.2023 4
09.03.2023 NA
10.03.2023 3
填写为:
date value
03.03.2023 1
04.03.2023 1
06.03.2023 4
09.03.2023 3
11.03.2023 3
说明:从03.03开始。更接近04.03,使用LOCF。从11.03开始。则使用nocb(locf,fromLast = T)。
如果NA值两侧有两个到参考日期距离相等的值,则可能发生最终冲突。在这种情况下,我希望locf是首选。
我目前的代码使用了两次僵硬的“locf”(一次作为标准,一次作为fromLast),并且没有那么灵活:
read.csv("path/to/merged_data.csv",
colClasses = c("Date", "numeric", "numeric", "numeric", "character")) %>%
group_by(field_id) %>%
arrange(date) %>%
mutate(
Nearest_l8_locf = ifelse(!is.na(NDVI_l7) & is.na(NDVI_l8), na.locf(NDVI_l8), NDVI_l8),
Nearest_s2_locf = ifelse(!is.na(NDVI_l7) & is.na(NDVI_s2), na.locf(NDVI_s2), NDVI_s2),
Nearest_l8_locb = ifelse(!is.na(NDVI_l7) & is.na(NDVI_l8), na.locf(NDVI_l8, fromLast = TRUE), NDVI_l8),
Nearest_s2_locb = ifelse(!is.na(NDVI_l7) & is.na(NDVI_s2), na.locf(NDVI_s2, fromLast = TRUE), NDVI_s2)
) %>%
filter(!is.na(NDVI_l7)) %>%
select(-NDVI_l8, -NDVI_s2) %>%
relocate(field_id, .after = last_col()) %>%
write_csv(file.path(results, "merged_data_interpolated.csv"))
在我的实际情况中,参考日期是列(NDVI_17)不是NA的所有日期,并且填充NA的过程针对另外两个列(NDVI_18和NDVI_s2)完成。它还按列“field_id”分组,因为这些ID中的每个ID的日期都是重复的。
如何调整代码,以便NA值填充最接近日期的值,而不管它在列中的哪个位置?
2条答案
按热度按时间qqrboqgw1#
我已经设法写了一个我需要的函数。
请注意,我在代码中添加了一个按年份分组的额外步骤。这是因为结果值不是正态分布。我的具体数据受季节性影响,仅适用于4月至7月。将该职能的运作限制在一年内解决了这个问题。
yzuktlbb2#
仅具有碱基R的另一变体:
d
是您的示例数据:将列日期转换为
Date
类:利用
dist
ance函数找到最近的邻居:输出: