на шаге данных SAS, ссылаясь на другой набор данных без слияния? - PullRequest
1 голос
/ 10 марта 2019

Благодарен за отзыв, я до сих пор программист уведомлений.Я пытаюсь кодировать ниже в SAS.

У меня есть два набора данных a) и b), которые содержат следующие переменные:

a) Bene_ID, county_id_1, county_id_2, county_id_3 etc (it's 12 months) 
b) county_ID, rural (yes/no) 

Что я обычно делал бы, это создавал массив на шаге данных:

Array country (12) county_ID_1- county_ID_12 

и использовать групповой обработкой на bene_ID для вывода длинного (нормализованного) набора данных, например:

   bene_id, month 1, county_id 
    bene_id, month 2, county_id
    bene_id, month 3, county_id 

и т. Д.

НО, как мне получить доступ к другим даннымустановить б) в шаге данных?тянуть в сельскую переменную?Это то, что я хочу:

bene_id, month 1, county_id, if rural = "yes"
bene_id, month 2, county_id, if rural = "yes"
bene_id, month 3, county_id, if rural = "yes"

Я пытался найти другие похожие вопросы на этой доске объявлений, но я даже не был уверен в правильных терминах для поиска.Причина, по которой я не хочу выполнять полное слияние: как фильтровать значения массива?например, когда сельский = "нет"?

Спасибо всем, Лори

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Это пример, где использование FORMAT может помочь.Вы можете использовать свой второй набор данных для создания формата

data formats;
  retain fmtname 'rural';
  set b;
  rename county_id=start rural=label;
run;

proc format cntlin=formats ;
run;

, а затем использовать формат при обработке первого набора данных.

data want ;
  set A;
  array county_id_ [12];
  do month=1 to dim(county_id_);
    county=county_id_[month];
    rural = put(county,rural3.);
    output;
  end;
  drop county_id_: ;
run;
0 голосов
/ 10 марта 2019

Вы преобразуете структуру данных из широкой (форма массива) в высокую (категориальная форма). Это обычно называется поворотом или транспонированием. Преобразование превращает информацию, хранящуюся в каждом элементе массива name (столбцы), в данные, которые становятся доступными на уровне строк.

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

* 80% of counties are rural;
data counties;
  do countyId = 1 to 50;
    if ranuni(123) < 0.80 then rural='Yes'; else rural='No';
    output;
  end;
run;

* for 10 people track with county they are in each month;
data have;
  do personId = 1 to 10;
    array countyId (12);
    countyId(1) = ceil(50*ranuni(123));
    do _n_ = 2 to dim(countyId);
      if ranuni(123) < 0.15 then 
        countyId(_n_) = ceil(50*ranuni(123)); * simulate 15% chance of moving;
      else
        countyId(_n_) = countyId(_n_-1) ;
    end;
    output;
  end;
run;

proc transpose data=have out=have_transpose(rename=(col1=countyId)) ;
  by personId;
  var countyId:;
run;

proc sort data=have_transpose;
  by countyId personId;
run;

data want_rural;
  merge have_transpose(in=tracking) counties;
  by countyId;
  if tracking and rural='Yes';
  month = input(substr(_name_, length('countyId')+1), 8.);
  drop _name_;
run;

Если ваши широкие данные также имеют дополнительный набор из 12 столбцов, например, массив сумм, выплачиваемых за каждый месяц, лучше всего сделать транспонирование «Шаг данных», как показывал @Tom, с дополнительным назначением внутри петля

  amount = amount_[month];
...