2013-09-20 3 views
1

Я пытаюсь пропустить столбец с 50000 строк. Я хотел бы сравнить значение в say i с (i + 1). Единственный способ, которым я знаю, как это сделать, - определить массив. Однако существует только одна переменная, например, имя столбца переменных, например. Col, но 50000 наблюдений внутри столбца. Когда я использую:SAS: Сравнить значения в столбце

array Transform {50000} Col 

где Transform это имя массива и Col это имя столбца в моем наборе, я получаю ошибку индекс, как существует слишком много переменных, то есть только один против 50000. Я попытался заменить {50000} с {50000,1} (и даже {*}), поэтому компилятор распознает, что есть 50k наблюдений и только один столбец. Далее я попытался перенести набор данных, но это кажется трудным, так как мне нужно добавить другую переменную к набору данных позже, которая зависит от значений i и (i + 1).

Есть ли способ прокрутки столбца для сравнения i и (i + 1) с использованием любого метода (не обязательно массива)? Спасибо за помощь :)

ответ

3

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

data want; 
merge have have (firstobs=2 rename=(col=col_plus1)); 
run; 
+0

Привет, Кейт, это может сработать. Могу ли я реализовать цикл IF, используя этот метод. В идеале я бы хотел использовать методы, которые являются «естественными», т. Е. Цикл «DO». Я довольно новичок в SAS, но не должен быть метод для циклического ввода записей строк, который более обобщен, например, я должен был сравнить i-й и (i + 2) -й записи? – Black

+2

@Blackholify Нет, в базе SAS нет метода для циклизации, как вы предлагаете. SAS - это язык на основе строк; код, который вы пишете, выполняется по каждой строке набора данных (по умолчанию) по одному за раз. SAS/IML - это матричный язык, который делает больше того, что вы предлагаете (если у вас есть лицензия, укажите это в OP). – Joe

+0

Привет, Джо, спасибо за предложение. Я не знал, что SAS является языком на основе строк, но это объясняет многое. У меня нет SAS/IML только базы SAS. – Black

1

Если вы хотите сравнить только строку i с i + 1, вы можете использовать функцию lag. Это вытащит значение из предыдущего чтения строки (будьте осторожны при использовании этого с циклами, так как не все строки будут обрабатываться в цикле)

4

Пример использования LAG:

data input; 
    infile cards; 
    input transform; 
cards; 
3 
5 
8 
12 
16 
; 
run; 

data comp; 
    set input; 
    transform_change = transform - lag1(transform); 
run; 

Для обратной последовательности строк:

data input_rownum/view=input_rownum; 
set input; 
rownum = _N_; 
run; 

proc sort data=input_rownum out=input_reversed; 
by descending rownum; 
run; 

data comp_reverse; 
    set input_reversed; 
    transform_change = transform - lag1(transform); 
run; 

LAG1 означает предыдущее значение переменной. LAG2 для предыдущего и так далее. Дополнительную информацию см. В документации.

+2

Почему бы не использовать функцию DIF вместо этого? – Longfish

+0

Спасибо за идею vasja. Мне нужно реализовать цикл if на i-й и (i + 1) -й записи в Col1. Существует ли метод, который использует цикл «DO», хотя LAG() может работать? Может быть, цикл DO за пределами петли IF? – Black

+0

Да, DIF - это менее известная функция :-) Спасибо за большое напоминание, Кейт. – vasja

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