جدولة متغيرات متعددة مع بادئة مشتركة باستخدام ماكرو محلي

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

  •  02-10-2019
  •  | 
  •  

سؤال

لدي عدد من المتغيرات التي يبدأ اسمها بالبادئة indoor. ما يأتي بعد indoor ليس رقميًا (من شأنه أن يجعل كل شيء أكثر بساطة).

أود جدولة لكل من هذه المتغيرات.

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

local indoor indoor*  
foreach i of local indoor {  
    tab `i' group, col freq exact chi2  
}

المشكلة هي indoor في ال foreach يحل الأمر إلى indoor* وليس إلى قائمة indoor أسئلة ، كما كنت آمل. لهذا السبب ، tab يتبع الأمر العديد من المتغيرات (يمكنه التعامل مع اثنين فقط) وهذا يؤدي إلى خطأ.

الإصلاح البسيط هو استبدال الأمر الأول بـ:

local indoor <full list of indoor questions>

ولكن هذا هو ما أود تجنبه ، وهو ما يجب أن أجد جميع أسماء هذه المتغيرات ثم لصقها في الكود. يبدو أن هناك حلًا أسرع لهذا ولكن لا يمكنني التفكير في أي.

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

المحلول

يمكنك القيام بذلك مع

foreach i of var `indoor' {
   tab `i' group, col freq exact chi2
}

نصائح أخرى

الحيلة هي الاستخدام ds أو unab لإنشاء توسع Varlist قبل مطالبة STATA بحلق على القيم في foreach عقدة.

إليك مثال لكل:

    ******************! BEGIN EXAMPLE

** THIS FIRST SECTION SIMPLY CREATES SOME FAKE DATA & INDOOR VARS **
    clear
    set obs 10000
    local suffix `c(ALPHA)'
    token `"`suffix'"'
    while "`1'" != "" {
        g indoor`1'`2'`3' =  1+int((5-1+1)*runiform())
        lab var indoor`1'`2'`3' "Indoor Values for `1'`2'`3'"
        mac shift 1
        }
    g group = rbinomial(1,.5)
    lab var group "GROUP TYPE"

** NOW, YOU SHOULD HAVE A BUNCH OF FAKE INDOOR 
**VARS WITH ALPHA, NOT NUMERIC SUFFIXES

desc  indoor*

**استعمال ds لإنشاء varlist الخاص بك ل foreach عقدة:

    ds indoor*
    di "`r(varlist)'"
    local indoorvars `r(varlist)'

    local n  0
    foreach i of local indoorvars {

** دعنا نقوم بتنظيف طاولاتك قليلاً مع بعض الرؤوس عبر display

    local ++n
    di in red "--------------------------------------------"
    di in red "Table `n':  `:var l `i'' by `:var l group'"
    di in red "--------------------------------------------"

**لك tab الجداول

    tab `i' group, col freq chi2 exact nolog nokey
    }
    ******************! END EXAMPLE

أو باستخدام unab في حين أن:

******************! BEGIN EXAMPLE
unab indoorvars: indoor*
di "`indoorvars'"

local n  0
foreach i of local indoorvars {
local ++n
di in red "--------------------------------------------"
di in red "Table `n':  `:var l `i'' by `:var l group'"
di in red "--------------------------------------------"

tab `i' group, col freq chi2 nokey  //I turned off exact to speed things up
}

******************! END EXAMPLE

مزايا ds تعال إلى اللعب إذا كنت ترغب في تحديد Vars الداخلي باستخدام قاعدة اختيار صعبة ، مثل اختيار Vars الداخلي بناءً على المعلومات في التسمية المتغيرة أو بعض الخصائص الأخرى.

هذا من شأنه أن يعمل. إنه متطابق تقريبًا للرمز في السؤال.

unab indoor : indoor*
foreach i of local indoor {
  tab `i' group, col freq exact chi2
}

يحتوي هذا السؤال على جزأين:

1. كيفية تعيين أسماء متغيرة متعددة إلى ماكرو محلي

كما لاحظ آخرون ، فإن الخيار الواضح هنا هو استخدام الأوامر ds و unab:

ds indoor*

unab indoor : indoor*

2. كيفية أتمتة جدولة المتغيرات التي تشارك بادئة مشتركة

بالنسبة لهذا الجزء ، فإن بناء الحلقات الحلقة "الأبسط والأكثر" في سياق Stata هو في الواقع الشخص الذي اقترحه Vadim (والذي كان مخدرًا):

foreach var of varlist indoor* {  
    tab `var' group, col freq exact chi2  
}

مما لا شك فيه ، يمكن للمرء أن يمزج بين النهجين ولكن في هذه الحالة يكون الأمر لا داعي له وغير فعال.

foreach v of varlist indoo* {
do sth with `v'
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top