WedX - журнал о программировании и компьютерных науках

когда освобождать запись во входном буфере с @ в sas?

Ниже приведена простая программа SAS:

data mydata;
  do group = 'placebo', 'active';
     do subj = 1 to 5;
        input score @;
        output;
     end;
  end;

datalines;
250 222 230 210 199
166 183 123 129 234
;

Я изучаю SAS самостоятельно. Так что я подумал, чтобы убедиться, что здесь происходит. Насколько я понимаю, первая строка из 5 записей относится к группе плацебо, а вторая строка относится к активной группе. Сначала входной буфер содержит первую строку из 5 чисел, и do subj=1 to 5 выводит их одно за другим, до конца итерации текущего шага данных. Затем шаг данных продолжается второй итерацией. Верно ли это понимание? Большое спасибо за ваше время и внимание.

PS. Я просто хочу убедиться, когда освободить текущий входной буфер. После проверки в Интернете я обнаружил, что цель @ заключается в следующем:

содержит входную запись для выполнения следующего оператора INPUT в той же итерации шага DATA. Этот спецификатор удержания строки называется замыкающим @.

Таким образом, это означает, что входной буфер освобождается, если выполняется одно из следующих двух условий:

(1): Новый оператор ввода встречается без символов @ или @@. (2): Конец текущей итерации шага данных.

Любые комментарии очень ценятся.

sas
16.01.2016

Ответы:


1

Ваш код должен работать нормально, но вы должны увидеть примечание о том, что SAS перешел на новую строку в вашем журнале.

Когда GROUP='placebo', внутренний цикл (DO SUBJ...) прочитает 5 чисел и оставит указатель в конце первой строки. Затем снова выполнится внешний цикл с GROUP='active'. Когда он пытается прочитать SCORE для SUBJ=1, в первой строке ничего не остается. Таким образом, SAS перейдет к следующей строке и прочитает оттуда первую SCORE. Затем из этой строки считываются остальные четыре значения.

Наконец, в конце шага данных он «освобождает» строку, поэтому указатель будет в начале третьей строки (если была третья строка).

Затем весь шаг данных зациклится еще раз и установит GROUP='placebo' и SUBJ=1, но когда он попытается прочитать SCORE, он прочитает конец файла и остановит шаг данных.

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

16.01.2016
  • Итак, я получу сообщение об ошибке, если @ будет удален? 16.01.2016
  • Неа. Без завершающего @ вы бы просто получили два наблюдения в своем наборе данных для GROUP='placebo', SUBJ=1 и 2 и SCORE = 250 и 166. Шаг данных остановится, когда вы попытаетесь выполнить оператор INPUT в третий раз. так как в ваших данных всего две строки. 17.01.2016
  • Более того, если do subj = от 1 до 5 изменить на do subj = от 1 до 2, то в группе плацебо будет 250 222 199 166 129 234, а в активной группе будет 230 210 183 123? 17.01.2016
  • Дело в том, чтобы играть с ним. Поместите туда несколько операторов PUT, чтобы вы могли видеть, какие значения имеют переменные в разных точках. 17.01.2016
  • Большое спасибо, Том. 17.01.2016

  • 2

    Мне нравится ответ Тома, но я хочу немного рассказать о значении итерации шага данных. Вы написали:

    Сначала входной буфер содержит первую строку из 5 чисел, и do subj=1 to 5 выводит их одно за другим, до конца итерации текущего шага данных. Затем шаг данных продолжается второй итерацией. Верно ли это понимание?

    Шаг DATA представляет собой подразумеваемый итеративный цикл сверху (оператор DATA) вниз (обычно оператор RUN, в данном случае я думаю оператор DATALINES). Если вы хотите увидеть, что происходит на каждой итерации цикла, вы можете записать значения в журнал с помощью оператора PUT, вы также можете записать в журнал N, который является счетчиком для итерации шага DATA. количество. Таким образом, вы можете изменить свой код на:

    do group = 'placebo', 'active';
       do subj = 1 to 5;
          input score @;
          put _n_= score= ;
          output;
       end;
    end;
    

    Если вы это сделаете, вы должны увидеть, что все данные (все 10 значений из обеих строк) обрабатываются на первой итерации шага ДАННЫЕ. Вы должны увидеть только _n_=1 в журнале. Как объяснил @Tom, это связано с тем, что в написанном вами явном цикле SAS переходит ко второй строке данных, когда не может найти шестое значение для чтения в первой строке. Я думаю, что большинство людей сочтут сообщение NOTE SAS о переходе на следующую строку предупреждением или даже ошибкой.

    Если вы хотите иметь две итерации пошагового цикла DATA, вы можете изменить что-то вроде:

    if _n_=1 then group = 'placebo';
    else if _n_=2 then group= 'active';
    
    do subj = 1 to 5;
      input score @;
      put _n_= score= ;
      output;
    end;
    

    (Не предполагая, что две итерации лучше или что приведенный выше код лучше, нужно просто показать, что означает итерация шага данных).

    16.01.2016
  • Отличный момент. Итак, шаг данных SAS запускает вторую итерацию только для определенных входных данных? Например, только для набора данных SAS в качестве входных данных или что-то в этом роде? Или когда шаг данных SAS начнет вторую итерацию? 17.01.2016
  • Шаг данных всегда повторяется, пока не будет достигнуто условие, которое заставит его остановиться. В этом случае он считывает все эти данные на первой итерации. Затем он повторяется во второй раз, и когда оператор ввода достигает конца файла, шаг останавливается. Если вы добавите put _ n _= вверху шага данных, вы должны увидеть запись _ n _ = 2 на второй итерации. Ключом к изучению шага ДАННЫЕ является изучение итерации, когда она останавливается и т. д. Это хорошие вопросы, над которыми стоит подумать. 17.01.2016
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]