【发布时间】:2020-12-01 19:24:21
【问题描述】:
我有一个类似于以下示例的数据集。我正在尝试创建一个与“预期”变量相同的变量。即如果 date_time 为“2020-01-02 12:00”,则创建一个包含 date_time 的 lag、lead 和 level 值的变量。
提前谢谢你。
df <- tibble(
date_time = c("2020-01-01 10:00","2020-01-01 11:00","2020-01-01 12:00","2020-01-01 13:00","2020-01-01 14:00","2020-01-02 10:00","2020-01-02 11:00","2020-01-02 12:00","2020-01-03 10:00","2020-01-03 11:00"),
date = c("2020-01-01","2020-01-01","2020-01-01","2020-01-01","2020-01-01","2020-01-02","2020-01-02","2020-01-02","2020-01-03","2020-01-03"),
x= seq.default(1,5.5,.5),
date_time_NA = c(NA,"2020-01-01 11:00",NA,NA,NA,NA,NA,"2020-01-02 12:00",NA,NA),
expected = c("2020-01-01 10:00","2020-01-01 11:00","2020-01-01 12:00",NA,NA,NA,"2020-01-02 11:00","2020-01-02 12:00","2020-01-03 10:00",NA)
)
df
新示例
我改变了上面的例子。所以我试图告诉 R 找到 date_time_NA 没有丢失的位置,然后创建一个变量,包括 date_time 的滞后、领先和水平值(类似于预期)。
更新:另一种解决方案
我使用@akrun 分享的代码提出了一个解决方案。这可能不是一个非常聪明的解决方案;但是,我发现它很直观。 主要思想是使用 ifelse 查找 date_time_NA 没有丢失的位置。然后我们可以再次使用 row_number() 并加 1 以便它可以找到领先并减 1 以便它可以找到滞后位置并将它们替换为 date_time 的值。
df %>%
mutate(na_row = ifelse(!is.na(date_time_NA),row_number(),NA),
row_level_lag = ifelse(row_number() %in% c(na_row), date_time,NA),
row_level_now = ifelse(row_number() %in% c(na_row + 1), date_time,NA),
row_level_lead = ifelse(row_number() %in% c(na_row - 1), date_time,NA),
date_time_expected = glue("{row_level_lag} {row_level_now} {row_level_lead}"),
date_time_expected = stringr::str_replace_all(string = date_time_expected,pattern = "NA",replacement = ""))
【问题讨论】: