我有一个类似于下面的框架-我的实际更大-并且想知道如何将NA与组内最近的非NA进行估算,对于一个整数变量-就日期而言最近-距离观察不到30天,之前或之后。当出现平局时,我想选择较早的日期,而不是较晚的日期。我找到了this,但它不能解释连续的NA。
任何帮助都将是非常感激的!
df <- data.frame(
id=c(1,1,1,1,2,2,2,3,3,3,4,4),
dates = c("2023-09-01", "2023-09-02", "2023-09-05", "2023-09-06","2023-09-10" , "2023-09-11",
"2023-09-12", "2023-09-14", "2023-09-16", "2023-09-20", "2023-09-27", "2023-09-28"),
x = c(10, NA, NA, 20, 20, NA, 30, 15, NA, NA, 40, NA)
)
# desired output
x1 <- c(10, 10, 20, 20, 20, 20, 30, 15, 15, 15, 40, 40)
1条答案
按热度按时间l7mqbcuq1#
样本数据并没有挑战“向前”寻找最近日期的前景。一些自动滚动/最近的填充开始工作,但没有一个固有的荣誉“30天的限制”需要。例如,在
data.table
-speak中,roll="nearest"
将始终匹配最近的日期,但不查看日期差异以查看它是否在约束范围内。我将建议替代数据,其中有需要向前看的行,向后看,以及一个不匹配的行,我将假设相差8天(反之30天)作为一个简单的例子:
值得注意的是,第3行在第2行和第4行的限制范围内,但由于第4行更近,因此应使用其值。
使用
data.table
,我认为这是可行的。该
fun
路由器的组件:outer(..)
计算日期差异;由于我们不想匹配具有NA
值的日期,因此在此内部,我们使用replace(dt, is.na(val), NA)
来NA出这些日期(然后使用abs(.)
整个事件)0
(self减去self是0),这在赋值时是自引用的,要么是NA
(当x
是NA
时),因此非NA
的值永远不会被其他值替换z
(日期差异矩阵)中,我们将lim
上的差异值替换为NA
z
中的所有值应该是NA
(无法匹配)或小于或等于lim
的正值,其中0
将始终是which.min
找到的最小值z
的每一行对应于我们想要的输出值,我们将使用apply(z, 1, ..)
,它将遍历每一行which.min(y)
本身,那么当没有非NA
值时,它将返回c()
,这将破坏我们所需要的;但是,将[1]
添加到 * 会强制 * 在这种情况下返回NA
,在所有其他情况下返回单个整数,因此which.min(y)[1]
将返回z
或NA
中日期差最小的列[NA]
的内容都将是NA
)使用2天的最大差值在原始数据上进行演示,
这里我们并不严格需要
data.table
。(请注意,此答案的先前版本使用fcoalesce
,并具有dplyr::coalesce
和base-R变体的翻译,但fun
不再需要它,因此这些额外的步骤已被删除。R的基础: