2017-02-04 3 views
1

Я новичок здесь. Я пытаюсь читать в наборе данных несколько раз. например, предположим, что у меня есть 3 наблюдения в наборе данных (называемый tempfile) для переменной temp. три наблюдения - 4,6 и 5. Поэтому я хочу читать в наборе х число раз, поэтому 4-е наблюдение будет 4, пятое будет 6 и шестое, будет 5. 7-е будет 4 и т. д. и т.д. Я попытался это буквально несколько десятков способов, делая что-то вродечтение набора данных несколько раз в SAS

data new; 
do i=1 to 100; 
set tempfile; 
end; 
output; 
run; 

Я попытался это, переместив сделать заявление, перемещение выходного заявления, опуская выходное заявление ..... врассыпную , также пытается использовать макросы. может ли кто-нибудь помочь? спасибо John

Followup ....

Здравствуйте: Спасибо за ответ. Это сработало. Я хотел бы сделать несколько вещей, связанных с некоторыми «if then» операторами внутри цикла (больше, чем просто чтение в наборе данных). Я хочу читать в наборе данных n количество раз, и каждый раз будет два, если бы тогда были операторы Итак, предположим, что я читаю в 3 числах любое количество раз; 7, 15 и 12 По мере чтения каждого номера он спрашивает, меньше ли он 10. И каждый раз он создает случайное число. Если меньше, чем 10, то Если < 0,4, то 1 добавляется к счетчика1, еще 1 Rand (форма) добавляется к Counter2 И если> = 10, Тогда Если Rand (равномерным) .2 < затем 1 добавлено в counter1, добавлено 1 к counter2 Любая помощь очень ценится. Thanks John

+1

Код, который вы отправили, будет подмножать данные вместо их тиражирования. Он будет выводить каждые 100 наблюдений. Итак, первая итерация будет читать 100 наблюдений и выводить последнюю. Следующая итерация будет делать то же самое, так что она выведет 200-е наблюдение и т. Д. Таким образом, вы получаете 1% -ный образец ваших данных. – Tom

ответ

3

Способ, которым на самом деле останавливаются большинство этапов данных, является то, что SAS считывается за конец ввода. Поэтому вам нужен метод, который не позволяет SAS делать это.

Самый простой способ репликации данных - просто выполнить несколько операторов вывода. Таким образом, первая запись повторяется три раза, то вторая запись повторяется три раза, и т.д.

data want; 
    set tempfile ; 
    do i=1 to 3; 
    output; 
    end; 
run; 

Другим методом является просто список набора данных несколько раз на SET заявлении. Таким образом, чтобы прочитать его в 3 раза просто использовать

data want; 
    set tempfile tempfile tempfile; 
run; 

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

data _null_; call symputx('list',repeat('tempfile ',3-1)); run; 
data want; set &list; run; 

Другой метод заключается в использовании POINT= и NOBS= варианты на SET заявление так, что SAS никогда не читает мимо конца, и вы можете вернуться назад к началу. Но так как он никогда не читает конца входных данных, вам нужно будет вручную сообщить об этом, когда остановиться.

data want ; 
    do i=1 to 3; 
    do p=1 to nobs ; 
     set tempfile point=p nobs=nobs; 
     output; 
    end; 
    end; 
    stop; 
run; 

Или больше в духе оригинального поста вы можете захотеть использовать функцию MOD(), чтобы выяснить, какие наблюдения, чтобы читать дальше.

data want; 
    if _n_ > 100 then stop; 
    p=1+mod(_n_-1,nobs); 
    set tempfile point=p nobs=nobs; 
run; 
+0

Это хорошие предложения, но ваш первый фрагмент будет производить другой порядок. – Leo

+0

спасибо, Том, посмотрим на них – GKJohn

0

Этап данных предназначен для последовательной обработки. В этом случае вам нужно «запомнить» предыдущие наблюдения. Вы можете сделать это, используя только шаг данных, но для этого варианта использования есть другие решения в среде SAS, которые проще.Один я предлагаю макрос, который добавляет оригинальный файл п раз:

%macro replicate(data=, out=, n=)/des='&out is &data repeated &n times.';  
    data &out; 
     set 
     %do i=1 %to &n; 
      &data 
     %end; 
     ; /* This ; ends the data step `set` statement */ 
    run; 
%mend; 

Вы можете проверить ваш пример с помощником:

%macro test; 
    data have; /* create the example data set */ 
     temp = 4; output; 
     temp = 6; output; 
     temp = 5; output; 
    run; 

    %replicate(data=have, out=want, n=4); 
    proc print; quit; 
%mend; 

Вот a portion of the SAS doc, который добавляет множество деталей с большим количеством примеров.

+0

спасибо Лео, я попробую это. – GKJohn

3

Если у вас есть программное обеспечение SAS/STAT SURVEYSELECT.

data have; 
    do temp=4,6,5; 
     output; 
     end; 
    run; 
proc surveyselect reps=10 rate=1 out=temp2 noprint; 
    run; 
Смежные вопросы