שימוש בפונקציה על מנת לפנות לעמודות שונות בטבלה

19 views
Skip to first unread message

גל אסף

unread,
Feb 22, 2018, 3:27:57 AM2/22/18
to Israel R User Group
היי,
אחרי שעזרו לי פה ממש בפורום, אני מתייעץ איתכם שוב, בתקווה שבעתיד אצליח גם לעזור ולא רק לשאול.
אני מנסה לייצר לולאה שתשלוף לי על עמודות שונות בטבלה 
בפעם הראשונה שתשלוף עבור age1
בפעם השנייה עבור age2
וכדומה עד  age10
לדעתי גם פה, אני מפספס את הפקודה הרלוונטית שאמור לעזור לי, 

ב-Stata זה יחסית פשוט 




לעומת זאת, ב-R אני לא כלכך מצליח להפנות בחלק הרלוונטי בטבלה כי הוא רוצה תת עמודה מסודרת Table$age ולא מאפשר לי לשלוף עם הלולאה
אשמח לעזרתכם, מצרף את הקוד כרגע, 

















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


amit gal

unread,
Feb 22, 2018, 3:42:27 AM2/22/18
to israel-r-...@googlegroups.com
אני חושב שהנסיון לתרגם קוד של סטאטה הוא בעוכרייך. בR עובדים אחרת. אולי במקום לנסות לתרגם (יצא לך קוד שהוא בעליל לא קריא וגם לא נכון), תיתן דוגמא קומפקטית לטבלה שאותה אתה רוצה לעבד, ודוגמא לתוצאה שאליה אתה מנסה להגיע, ואז אפשר יהיה לעזור לך יותר

--
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.

גל אסף

unread,
Feb 22, 2018, 4:31:04 AM2/22/18
to Israel R User Group

מקבל, 
התוצר שאני רוצה להגיע אליו הוא טבלה מרוכזת כמו החרדים בסקר של הלמ"ס 



בטבלה יש המון נתונים, אבל כדאי לפשט אותו יצרתי נתוני עזרה 
hared - עמודה בינארי  של חרדי/לא חרדי 
age1 - נסקרים בקבוצת הגיל הראשונה (20-44) 
age2 -נסקרים בקבוצת הגיל השנייה 
age3 נסקרים בקבוצת הגיל שלישי 
sex1 - גברים
sex2 - נשים
sex3 - גברים ונשים

אני הייתי רוצה ליצור לולאה תעבור בין השנים, תקרא את הקבצים של הלמ"ס שיש לי על המחשב ותכניס את הנתונים הללו למטריצה ותייצא אותה לאקסל.
הבנתי שהשיטה שלי לא טובה ושגויה אז במקום זה השתמשתי בwhich -כדי לדעת באיזה עמודה אני ולנסות לשלוף משם לפי המספר, אבל זה עדיין לא עובד בצורה חלקה. 
מצרף את הקוד.
ביינתים התוצר שאני מקבל ממש ריק, משמע גם הלולאה של השנים לא עובדת טוב וגם הלולאה של הסכימה והצבה במטריצה





בתאריך יום חמישי, 22 בפברואר 2018 בשעה 10:42:27 UTC+2, מאת Amit Gal:
מספר חרדים בסקר החברתי.R

גל אסף

unread,
Feb 22, 2018, 5:00:51 AM2/22/18
to Israel R User Group
מעדכן את הקוד, הלולאה של השנים עובדת על התוצר עדיין ריק 

בתאריך יום חמישי, 22 בפברואר 2018 בשעה 10:27:57 UTC+2, מאת גל אסף:
מספר חרדים בסקר החברתי.R

amit gal

unread,
Feb 22, 2018, 6:18:13 AM2/22/18
to israel-r-...@googlegroups.com
האם הטבלה המקורית היא של נסקרים ספציפיים? כלומר כל שורה מייצגת אדם אחד, וכל טור מאפיין של אותו אדם?
ומה שאתה רוצה זה רק לספור אנשים לפי קבוצות?
בכל מקרה אני לא אוהב את פורמט הפלט, כי כל טור בו מייצג צירוף של כמה תכונות. אבל לא בריא להילחם בטחנות רוח.

נפתור את זה בשלבים: שלב ראשון להגדיר את המשתנים שמגדירים כל מימד, מופרדים לפי רמות:
age_level = c("age1","age2","age3")
בדוגמה הזו ממש הקלדתי את כל הטורים, וזה סביר אם יש 2-3 כאלה. אם יש יותר, נניח 10 קבוצות גיל, אפשר ליצר את הוקטור הזה אוטומטית:
age_level = paste0("age",1:10)

באותו אופן מייצרים גם את הרמות האחרות:
sex_level = paste0("sex",1:3)
sample_level = c("employed","all")
ההנחה החזקה כאן היא שכל הטורים הנ"ל אכן קיימים בדאטה, כטורים לוגיים שמציינים השתייכות לקבוצה הרלוונטית. הטור all הוא טור שכולו T.

בשלב השני מייצרים את כל הצירופים האפשריים:
combs = exapnd.grid(age_level,sex_level,sample_level)


עכשיו הרעיון הוא לעבור  שורה שורה על טבלת הקומבינציות. כדי להגביר את הקריאות, נגדיר קודם פונקציה שמקבלת וקטור עם שמות טורי האינדיקציה, ומחזירה את מספר השורות שמקיימות את התנאי:

cond_count = function(cols,data) sum(rowSums(data[,cols])==length(cols))

result = apply(combs,1,cond_count,data=my_data)

רצוי להוסיף שמות:
names(result) = apply(combs,1,paste,sep="_",collapse="_")
ושוב למען הקריאות, נארוז את כל הנ"ל בקריאה לפונקציה:
cond_summary = function(data,levels) {
   combs = expand.grid(levels)
   cond_count = function(cols,data) sum(rowSums(data[,cols])==length(cols))
   result = apply(combs,1,cond_count,data=data)
   names(result) = apply(combs,1,paste,sep="_",collapse="_")
   result
}

ולבסוף את כל הפרוצדורה הזו רוצים לבצע על הדאטה שלנו לפי שנים:
library(dplyr)
processed_data = original_data %>% group_by(year) %>% do(cond_summary,levels=list(age_level,sex_level,sample_level))

וזהו.
 





גל אסף

unread,
Feb 22, 2018, 8:55:27 AM2/22/18
to Israel R User Group
תודה רבה על העזרה!
לגבי הפלט, אני מסכים, בגלל זה אני בוחן דרך אחרת- להגדיר וקטורים ואז לייצר בסוף טבלה עם וקטורים הספיצפיים בהתאם לצורך.
תודה על המענה המפורט והמנומק


בתאריך יום חמישי, 22 בפברואר 2018 בשעה 13:18:13 UTC+2, מאת Amit Gal:
Reply all
Reply to author
Forward
0 new messages