2016-07-13 10 views
1

У меня есть набор данных SAS говорят, df так:Удаление строк в наборе данных SAS, где все остальные значения отсутствуют, за исключением одного столбца

Input: 
A B C D 
1 . . . 
2 . . . 
3 0 1 1 
4 1 0 1 

Код для данных порождений:

data df; 
    input A B C D; 
    DATALINES; 
1 . . . 
2 . . . 
3 0 1 1 
4 1 0 1 
; 
run; 

Теперь я хочу удалить 1-й 2 строки. Мне нужна логика, чтобы удалить эти строки в df, где все значения отсутствуют в строке, кроме A.

Output: 
A B C D 
3 0 1 1 
4 1 0 1 

Я очень новый для SAS, и я прошу ответ без proc sql.

Примечание: здесь я дал всего 4 столбца. На самом деле у меня есть более чем 25 columns.I нужен обобщенный ответ без использования имен столбцов B, C, D

+0

могут быть разные столбцы с отсутствующими значениями в каждой строке? –

+0

Нет, мое требование: у меня всегда есть значение в A. Только от B до D всегда будут отсутствовать значения. –

ответ

0
data result; 
    set df; 
    where ^missing(B) and ^missing(C) and ^missing(D); 
run; 

или

proc sql noprint; 
    create table result as 
    select * 
    from df 
    where ^missing(B) and ^missing(C) and ^missing(D); 
quit; 

EDIT:

proc contents data=df out=df_CONTENTS; run; 
proc sql noprint; 
    select cats('^missing(',NAME,')') into :var_names separated by ' and ' 
    from df_CONTENTS 
    where NAME ^= 'A'; 
quit; 

, а затем вы можете использовать значение 'var_names' для условия в where where как:

where &var_names;

+0

Извините, Андрей, я забыл упомянуть записку ранее. Обновлено Примечание. В любом случае спасибо за ответ. –

1

Поместите все соответствующие переменные в массиве и подсчитать количество пропущенных значений НЕЧЛЕНОВ. Выведите все строки с одним или несколькими недопустимыми значениями.

data want; 
    set df; 
    array varlist B -- D; 
    do over varlist; 
     not_missing = sum(not_missing, ^missing(varlist)); 
    end; 
    if not_missing > 0 and ^missing(A) then output; 
run; 
+0

Логика завершается с ошибкой, если у меня есть не пропущенное значение в B или C или D в 1-м 2 строках и отсутствует A. Я имею в виду, что если A является нулевым, а B не является нулевым в 1-й строке, оно равно как выход. –

+0

Не могли бы вы привести пример данных в своих вопросах? Вы хотите проверить пропуски в A или нет? Я поменяю свой ответ на отдельную проверку A. – Jetzler

1

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

data have; 
Input A B C D; 
datalines; 
1 . . . 
2 . . . 
3 0 1 1 
4 1 0 1 
; 
run; 

data have; 
modify have; 
if n(of B--D)=0 then remove; 
run; 
+0

Логика хороша для числовых столбцов, но у меня тоже есть столбцы символов. –

+0

Вместо этого используйте функцию CMISS(), но вам нужно знать, сколько там переменных. 'if cmiss (of b - d) <3;' – Tom

+0

@Tom Именно то, что я собирался поставить. За исключением этого следует сказать = 3, а не <3 – Longfish

3

Вы можете использовать функцию CMISS() как для числовых, так и для символьных переменных. Но вам нужно знать, сколько переменных есть.

data have; 
    input A B C $ D; 
cards; 
1 . . . 
2 . . . 
3 0 1 1 
4 1 0 1 
; 

data want; 
    set have; 
    if cmiss(of B--D)<3 ; 
run; 

 Смежные вопросы

  • Нет связанных вопросов^_^