2015-06-01 6 views
2

У меня есть набор данных, содержащий пустые ячейки. Похоже, чтоУдалить пустые строки в SAS

Year Volume ID  
2000 999  LSE 
2001 .   LSE 
.  555  LSE 
2008 .   NYSE 
2010 1099  NYSE 

Мне нужно удалить строку, содержащую пустые ячейки. Вывод должен выглядеть следующим образом

Year Volume ID  
2000 999  LSE 
2000 1099  NYSE 

Я попытался следующий код

data test; 
set data; 
if volume = " . " then delete; 
if year= " . " then delete; 
run; 

Но выходной файл имеет 0 наблюдения и SAS дает мне

NOTE: Character values have been converted to numeric values at the  
places given by (Line):(Column). 

Также я попытался

options missing = ' '; 
data test; 
set data; 
if missing(cats(of _all_)) then delete; 
run; 

Но его не волнует король.

Я просто хочу удалить строки с пустыми ячейками. Кто-нибудь может помочь мне решить эту проблему? Заранее спасибо !!!

+0

Как уже упоминалось Джо, ваш код выше должен по-прежнему работать с автоматическим преобразованием символа в числовой. Должно быть что-то еще происходит. Есть ли что-нибудь еще на вашем шаге данных? – DWal

ответ

1

Вы можете просто использовать Подменю if nmiss() путем проверки переменных, которые должны быть заполнены:

data test; 
    set data; 
    if nmiss(year,volume)=0 ; 
run; 
+0

спасибо @Bendy, но он не работает ... есть 0 obs на выходе T.T –

+0

Проверьте, являются ли ваши переменные year/volume числовыми ... если они являются символами, то используйте 'cmiss()', как сказал Джо – Bendy

1

Не используйте кавычки с числовыми переменными, например:

if volume = . then delete; 

Другой вариант, который работает либо цифры или цифры:

if missing(volume) then delete; 
3

Options Missing влияет только на то, как вещи печатаются или преобразуются при движении числового -> символ. В этом случае у вас есть цифры, поэтому ничего не получается.

Ваш первый пример кода в основном правильный - по крайней мере, когда я пытаюсь, он работает. " . " не совсем прав, но он будет конвертировать (как отмечает примечание) в пропасть, поскольку ни один из этих символов не является числом.

Правильный способ сделать это один из двух:

data have; 
input Year Volume ID $; 
datalines; 
2000 999  LSE 
2001 .   LSE 
.  555  LSE 
2008 .   NYSE 
2010 1099  NYSE 
;;;; 
run; 

data want; 
    set have; 
    if year = . then delete; 
    if volume = . then delete; 
run; 

или

data want; 
    set have; 
    if missing(year) then delete; 
    if missing(volume) then delete; 
run; 

missing возвращает истину, если переменная отсутствует (которая включает в себя 28 полных значений, но . является наиболее общий).

Лучший способ сделать больше, чем один является использование nmiss или cmiss функций (nmiss для чисел, cmiss для символа или смешанного типа).

data want; 
    set have; 
    if nmiss(year,volume) = 0; 
run; 

Это возвращает количество пропущенных значений, которые вы можете проверить на то, что значение, которое вы ищете (в данном случае, нулевые значения). Можно даже сделать:

data want; 
    set have; 
    if nmiss(of _NUMERIC_) = 0; 
run; 

где _NUMERIC_ это все числовые переменные.(of необходимо для переменных списков, как это сказать SAS ожидать список.)


Ваших второй не работает, кстати, потому что это catting переменного ID вместе с остальными. Вы могли бы увидеть это, посмотрев на значение этого cats (т. Е. Присвойте его переменной). Вы могли бы сказать

if cats(of _all_) = ID then delete;

но некоторые из нас показали, что, вероятно, уступает более простых решений с использованием nmiss.

0

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

data new_dataset; 
set old_dataset (where = (volume is not missing or year is not missing)); 
run; 

Я всегда люблю использовать синтаксис is not missing, потому что кажется слишком много, как писать нормальный английский работать

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