保持当前值直到出现非空值
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})
但我认为语法不正确。
我们可以使用 zoo 包中的 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
或者 tidyr 包中的 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)
您好,我有 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})
但我认为语法不正确。
我们可以使用 zoo 包中的 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
或者 tidyr 包中的 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)