这是一个简化的数据示例。
df <- data.frame(
SU = c(1, 1, NA, NA, NA, NA),
TIME = c(10, 20, 30, 40, 50, 60),
AMT = c(5, 5, NA, NA, 5, 5)
)
我想生成一个新列 TFDS,如果 is.na(SU) == TRUE,则使用 TIME 减去前一个 AMT 而不是 NA 行的 TIME。
这就是我想要的。
苏 | 时间 | 主动机械式 | 特遣队 |
---|---|---|---|
1 | 10 | 5 | 不适用 |
1 | 20 | 5 | 不适用 |
不适用 | 三十 | 不适用 | 10 |
不适用 | 40 | 不适用 | 20 |
不适用 | 50 | 5 | 三十 |
不适用 | 60 | 5 | 10 |
我尝试过dplyr::lag()
,但输出不是我想要的。
library(dplyr)
df <- df |>
mutate(
TFDS = if_else(
is.na(SU) == TRUE, TIME - lag(TIME)[!is.na(AMT)], NA
))
我相信dplyr::lag()
应该在那里使用,但如何设置[!is.na(AMT)]
?
您可以创建一个临时列并用来
tidyr::fill()
从与最后一个非 NA AMT 值相对应的 TIME 值向下填充,然后使用以下命令减去值lag()
: