قم بإنشاء متغير وهمي بناءً على عدد مرات الظهور المتغيرة باستخدام SAS

StackOverflow https://stackoverflow.com//questions/25004053

  •  20-12-2019
  •  | 
  •  

سؤال

أحاول إنشاء متغير وهمي A للإشارة إلى عدد مرات ظهور المعرف.إذا ظهر المعرف مرتين بالضبط، فإن A يساوي 0؛إذا ظهر المعرف أكثر من مرتين، فإن A يساوي 1.

الإخراج المطلوب هو كما يلي:

  ID     YEAR  A
 1078    1989  0
 1078    1999  0
 1161    1969  0
 1161    2002  0
 1230    1995  0
 1230    2002  0
 1279    1996  0
 1279    2003  0
 1447    1993  0
 1447    2001  0
 1487    1967  1
 1487    2008  1
 1487    2009  1
 1678    1979  0
 1678    2002  0

الكود الخاص بي هو:

data new data;
  set data;
  by ID YEAR;
  if First.ID then count=0;
  count+1;
run;


data newdata;
  set newdata;
  by ID YEAR count;
  if sum(count)=3 then A=0;
  if sum(count)>3 then A=1;
run;

لكن الإخراج غير صحيح.

هل كانت مفيدة؟

المحلول

لا يمكنك استخدام sum(count) لجمع العدد عبر ملاحظات متعددة.بدلاً من ذلك، تحتاج أولاً إلى حساب الملاحظات، ثم دمج الأعداد في البيانات الأصلية.

حل خطوة البيانات

data newdata;
set data;
by ID YEAR;
if First.ID then count=0;
count+1;
if last.id then output;
drop year;
run;

if last.id then output يعني أن البيانات الجديدة لن تحتوي إلا على الملاحظة الأخيرة لكل معرف.نريد ذلك لأن الملاحظة الأخيرة تحتوي على عدد الملاحظات لكل معرف.

تقوم هذه الخطوة بدمج "بيانات" البيانات الأصلية مع الأعداد من "البيانات الجديدة" وحساب أ.

data newdata2;
merge data newdata;
by ID;
if count=2 then A=0;
if count>2 then A=1;
drop count;
run;

حل بروك SQLيمكنك القيام بذلك بسرعة أكبر باستخدام proc sql:

proc sql;
    create table newdata as
    select id, year, (case when count(*) = 2 then 0 else 1 end) as a
    from data
    group by id;
quit;

group by id يعني أن الإحصائيات الموجزة مثل count() يتم حسابها بواسطة المعرف، وبالتالي فإن count(*) يعني عدد الملاحظات في كل معرف. (case when count(*) = 2 then 0 else 1 end) as a يخلق متغير أ.إذا كان عدد المعرف المحدد هو 2، فإن a يأخذ القيمة 0، وإلا يأخذ a القيمة 1.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top