您好我来自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})
但我不认为语法是正确的。
答案 0 :(得分:1)
我们可以使用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)