保持当前值直到出现非空值

Hold current value until non-null value occurs

您好,我有 SAS 背景,对 R 比较陌生。我正在尝试将现有的 SAS 程序转换为等效的 R 代码

我不确定如何在 R

中实现与 SAS "retain" 和 "by" 行为等​​效的行为

我有一个包含两列的数据框,第一列是日期列,第二列是数值。

数字列表示实验室测试的结果。测试是半定期进行的,因此在某些日子里数据中会有 Null 值。数据按日期排序,日期是连续的。

即示例数据如下所示

Date        Result
2017/01/01      15
2017/01/02      NA
2017/01/03      NA
2017/01/04      12
2017/01/05      NA
2017/01/06      13
2017/01/07      11
2017/01/08      NA

我想创建第三列来包含最新的结果。 如果结果列为 Null,则应将其设置为最近的先前非 Null 结果,否则它应包含结果值

我想要的输出如下所示:

Date        Result  My_var
2017/01/01      15  15
2017/01/02      NA  15
2017/01/03      NA  15
2017/01/04      12  12
2017/01/05      NA  12
2017/01/06      13  13
2017/01/07      11  11
2017/01/08      NA  11

在 SAS 中,我可以使用如下代码片段实现此目的:

data my_data;
    retain My_var;
    set input_data;
    by date;

    if Result not = . then
        my_var = result;
run;

我对如何在 R 中执行此操作感到困惑我认为 R 不像在 SAS 中那样支持按组处理 - 或者至少我不知道如何将其设置为选项。

我曾天真地尝试过:

my_data <- mutate(input_data, my_var = if(is.na(Result)) {lag(Result)} else {Result})

但我认为语法不正确。

我们可以使用 包中的 na.locf 函数来填充缺失值。

library(zoo)

dt$My_var <- na.locf(dt$Result)
dt
#         Date Result My_var
# 1 2017/01/01     15     15
# 2 2017/01/02     NA     15
# 3 2017/01/03     NA     15
# 4 2017/01/04     12     12
# 5 2017/01/05     NA     12
# 6 2017/01/06     13     13
# 7 2017/01/07     11     11
# 8 2017/01/08     NA     11

或者 包中的 fill 函数。

library(dplyr)
library(tidyr)
dt <- dt %>% 
  mutate(My_var = Result) %>%
  fill(My_var)
dt
#         Date Result My_var
# 1 2017/01/01     15     15
# 2 2017/01/02     NA     15
# 3 2017/01/03     NA     15
# 4 2017/01/04     12     12
# 5 2017/01/05     NA     12
# 6 2017/01/06     13     13
# 7 2017/01/07     11     11
# 8 2017/01/08     NA     11

数据

dt <- read.table(text = "Date        Result
2017/01/01      15
                 2017/01/02      NA
                 2017/01/03      NA
                 2017/01/04      12
                 2017/01/05      NA
                 2017/01/06      13
                 2017/01/07      11
                 2017/01/08      NA",
                 header = TRUE, stringsAsFactors = FALSE)