保持当前值,直到出现非空值[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

嗨,我来自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})

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

r dataframe data-manipulation retain
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.