Пошаговая операция для подмножества столбцов - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующие данные:

data df;
input id $ d1 d2 d3;
datalines;
a . 2 3
b . . .
c 1 . 3
d . . .
;
run;

Я хочу применить некоторые преобразования / операции к подмножеству столбцов. В этом случае это означает удаление всех строк, в которых столбцы с префиксом d равны all отсутствует / null.

Вот один из способов, которым я достиг этого, получив сильное влияние от этого SO сообщения .

Сначала суммируйте все числовые столбцы по строкам.

data df_total;
set df;
total = sum(of _numeric_);
run;

Затем удалите все строки, в которых отсутствует total / null.

data df_final;
set df_total;
where total is not missing;
run;

Что дает мне вывод, который я хотел:

a . 2 3
c 1 . 3

Моя проблема, однако, заключается в том, что этот подход предполагает, что существует только один столбец «первичного ключа» (в данном случае id), а все остальное является числовым и должно рассматриваться как часть этой логики sum(of _numeric_) is not missing .

На самом деле, у меня есть множество других столбцов в исходном наборе данных, df, и просто невозможно drop всех их записать. Я знаю, что столбцы, для которых я хочу выполнить этот «тест», имеют префикс d (а точнее, соответствие шаблону d<mm><dd>).

Как я могу расширить этот подход для определенного подмножества столбцов?

1 Ответ

0 голосов
/ 01 ноября 2018

Используйте другую краткую ссылку, поскольку вы знаете, что все начинается с D,

total = sum( of D:);
if n(of D:) = 0 then delete;

Который будет добавлять числовые переменные и начинаться с D. Если у вас есть переменные, которые вы хотите исключить, начинающиеся с D, это проблематично.

Поскольку оно числовое, вы также можете использовать функцию N (), которая подсчитывает не пропущенные значения в строке. В целом, однако, SAS сделает это автоматически для большинства PROCS, таких как REG / GLM (очевидно, не на этапе данных).

Если это по какой-то причине не работает, вы можете запросить список переменных из таблицы sashelp.

proc sql noprint;
select name into :var_list separated by ", " from sashelp.vcolumn
where libname='WORK' and memname='DF' and name like 'D%';
quit;

data df;
   set have;
   if n(&var_list.)=0 then delete;
run;
...