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

时间:2017-12-21 00:46:45

标签: r dataframe data-manipulation retain

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

我不确定如何在R中实现相当于SAS的“保留”和“通过”行为

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

数字列表示实验室测试的结果。测试是半定期进行的,所以在某些天数据中会有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

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

我想要的输出如下:

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})

但我不认为语法是正确的。

1 个答案:

答案 0 :(得分:1)

我们可以使用包中的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)