有什么方法可以应用条件逻辑来保存/删除SAS中的列?

时间:2019-04-03 15:58:04

标签: sas

我试图基于宏变量在SAS中删除特定的列,在使用什么代码方面我的手有些紧-因此我需要BASE SAS解决方案。

我已经尝试过将drop / keep封装在if中,但是我知道drop在运行时发生,所以这行不通。

示例:

# a dataset
df <- data.frame(day = rep(c(1:5),3),
                 group = c(rep(1,5),rep(2,5),rep(3,5)),
                 var_a = seq(1:15),
                 var_b = seq(2,30, length.out = 15),
                 var_c = seq(3,45, length.out = 15))

# the logic of what I am going for, on a manually extracted example group:
# initial value (day == 1) of var_a for group 2

df_subset <- df %>% 
  filter(group == 2)
df_subset$var_a[which(df_subset$day == 1)]
# [1] 6

# my laughable attempt at a function

initial <- function(x){
  ini <- which(.$day == 1)
  x[ini]
}

# custom function deployed in dplyr pipe (which of course doesn't work)
df %>% 
  group_by(group) %>% 
  summarize_at(c("var_a","var_b","var_c"), 
               list(max = max, ini = initial)) 

2 个答案:

答案 0 :(得分:3)

您要么需要使用宏代码来有条件地生成所需的代码。

updateSQL

或进行更改,以便宏变量具有要删除的列的列表。

data dropsomecolumns;
  set have;
%if &somemacro =1 %then %do;
  drop somecol1 somecol2;
%end;
run;

请注意,如果未列出任何变量,则drop语句将给出警告,但drop = dataset选项将不会给出警告。

答案 1 :(得分:0)

您没有列出任何变量,它将正常工作,并假定不删除该变量。因此,如果宏变量是变量列表,请使用:

 drop &drop_columns;

这很好:

data demo;
    set sashelp.class;
    drop ;
run;

因此不需要条件逻辑。