עזרה ב-R ,הפנייה למשתנים כאשר הם משפיעים על מטריצות בתוך הלולאה

30 views
Skip to first unread message

גל אסף

unread,
Feb 15, 2018, 6:35:49 AM2/15/18
to Israel R User Group
היי, אני ממש חדש ב-R אז מצטער על השאלה המאוד "צעירה" הזאת.
אני מנסה להסביר את עצמי כמיטב יכולתי, צירפתי גם קוד ב-R ובSTATA 
הקוד ב-STATA עובד, אני מנסה לעשות אותו דבר ב-R


היי, זוהי שאלתי.

כיצד בעצם מפנים משתנה בתוך הלולאה כדי שהוא יהיה חלק מהשמות של אובייקטים שאני מתייחס אליהם.

אני מנסה לבנות קוד שירוץ על שלושת מטריצות והשמות שלהם יהיו לפי הלולאה:

 for (a in 1:3)

  local(temp.name <- c("sample:man","sample:women","sample:all","employed:man","employed:women","employed:all"))

  age'a' <- matrix(, nrow = 12, ncol = 6)

כאשר בעצם הפלט שאני רוצה לייצר הוא שלושה מטריצות זהות שיקבלו את השם -  age1, age2, age3

הבעיה היא שאני לא יודע איך להפנות -a כדי שזה התוצר יצא,

לצורך העניין ב-STATA זה עובד כמו שכתבתי פה:

 

forv a=1/3 {

mat age`a'=J(12,6,.)

 

אני מרגיש חסר לי פה משהו בהבנה או של התחביר של R או שחסרה לי פנוקציה שאני לא מכיר

 

 

באופן דומה, כאשר אני רוצה להכניס נתונים לתוך המטריצה, מה שעובד פשוט ב-STATA, לא עובד לי בכלל ב-R, הפנייה לא עובדת כי הוא מתייחס ל'a כמחרוזת ולא כמשתנה.

נסיתי גם בעזרת paste0 אבל זה רק מסרבל ועדיין לא עובד

גם פה השאלה זהה, כיצד אני מתפנה כל פעם למטריצה האחרת (לפי a)

 

הקוד ב-R:

 

 

  for (s in 1:3) {

    for (a in 1:3) {

      age'a'[y,s] <-sum(Worktable$all&Worktable$sex's'==TRUE&Worktable$age'a'==TRUE&Worktable$hared==1)

 

כאשר הקוד ב-סטסא

 

 

forv s=1/3 {  // לולאה שרצה על מינים: גברים, נשים, גברים ונשים

                                forv a=1/3           { // לולאה שרצה על 3 קבוצות הגיל

                                                qui sum all if sex`s' & age`a' & hared // פונקציית סכום לפי מין וגיל עבור חרדים

                                                 mat age`a'[`y',`s']=r(N) // השמת מספר התצפיות בהתאם לקבוצה שחושבה בשורה לעיל במטרציה המתאימה לקבוצת הגיל

 

תודה רבה על העזרה והסיוע

 

Ariel Telpaz

unread,
Feb 15, 2018, 6:45:01 AM2/15/18
to israel-r-...@googlegroups.com
לצרכים כאלה בדר"כ משתמשים ב)eval(parse שמאפשר לך להתייחס למחרוזת כאל שורת קוד, והנה הפתרון:
for(a in 1:3){
    eval(parse(text= paste0("age",a," <- matrix(, nrow = 12, ncol = 6)")))
 }
  
אריאל

--
You received this message because you are subscribed to the Google Groups "Israel R User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email to israel-r-user-group+unsub...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

amit gal

unread,
Feb 15, 2018, 7:14:13 AM2/15/18
to israel-r-...@googlegroups.com
הפקודה הרלוונטית היא assign שאחד הפרמטרים שהיא מקבלת זה את שם המשתנה. מותר להתפרע.
אפשר גם לעשות השמה על ידי הפניה לסביבה:
.globalEnv()[["x"]]=5
מייצר בסביבה הגלובלית אובייקט בשם "x" שמכיל 5

To unsubscribe from this group and stop receiving emails from it, send an email to israel-r-user-group+unsubscribe...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

גל אסף

unread,
Feb 21, 2018, 7:42:55 AM2/21/18
to Israel R User Group
 
ואוו, זה ממש ממש מפשט את העניין, תודה רבה! 

בתאריך יום חמישי, 15 בפברואר 2018 בשעה 14:14:13 UTC+2, מאת Amit Gal:
To unsubscribe from this group and stop receiving emails from it, send an email to israel-r-user-group+unsub...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages