האם הטבלה המקורית היא של נסקרים ספציפיים? כלומר כל שורה מייצגת אדם אחד, וכל טור מאפיין של אותו אדם?
ומה שאתה רוצה זה רק לספור אנשים לפי קבוצות?
בכל מקרה אני לא אוהב את פורמט הפלט, כי כל טור בו מייצג צירוף של כמה תכונות. אבל לא בריא להילחם בטחנות רוח.
נפתור את זה בשלבים: שלב ראשון להגדיר את המשתנים שמגדירים כל מימד, מופרדים לפי רמות:
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))
וזהו.