2015-02-19 2 views
1

У меня возникли проблемы с созданием таблицы с plyr, и я надеюсь, что вы сможете помочь. Если вы запустите код ниже, вы должны получить таблицу с пропорциями на самом высоком уровне совокупности моих данных (т. Е. Весь набор данных). Тем не менее, я хотел бы получить ту же таблицу с пропорциями по каждому предмету для каждой школы. Спасибо за любую помощь. Кроме того, если есть лучший способ синтезировать это с помощью только dplyr, я открыт для него. Я пытаюсь интегрировать некоторые из этих новых пакетов в свой рабочий процесс.Создание вложенной таблицы с ddply

# load packages 
library(plyr) 
library(dplyr) 
library(reshape2) 
library(tidyr) 
library(xtable) 
# generate fake Data 
set.seed(500) 
School <- rep(seq(1:20), 2) 
District <- rep(c(rep("East", 10), rep("West", 10)), 2) 
Score <- rnorm(40, 100, 15) 
Student.ID <- sample(1:1000,8,replace=T) 
items <- data.frame(replicate(10, sample(1:4, 40, replace=TRUE))) 
items <- data.frame(lapply(items, factor, ordered=TRUE, 
levels=1:4, 
labels=c("Strongly disagree","Disagree", 
"Agree","Strongly Agree"))) 
school.data <- data.frame(Student.ID, School, District, Score, items) 
rm(items) 
# code for table 
items <- select(school.data, School, X1:X10) 
g <- items %>% 
    gather(Item, response, -School) 
# This gives me the aggregate results for the entire data set 
foo <- ddply(g, .(Item), function(x) prop.table(table(x$response))) #I stupidly tried .(Item, School) to no avail 
xtable(foo) 
+1

Попробуйте 'prop.table (с (g, table (response, Item, School)), margin = 2)', который дает массив 4x10x20 (ответы, предметы, школы). Вы можете использовать 'as.data.fame' в результате для преобразования, если это необходимо. – lukeA

+0

@ lukeA: Большое спасибо. Это приближает меня к тому, что мне нужно. Я передумал это дезорганизованным образом. – bfoste01

+0

R все время подавляющее - имеет свои плюсы и минусы. ;) Я отправлю его в качестве ответа. Проверьте это, если хотите, или подождите других ответов. – lukeA

ответ

1

Попробуйте

prop.table(with(g, table(response, Item, School)), margin = 2) 

Это дает 4x10x20 массив (ответы, пункты, школы). Вы можете использовать as.data.fame на результат для преобразования, если необходимо.

+0

Подождите: это отлично работает для того, что я спросил, и мне тоже нужно что-то делать. Мне просто нужно использовать другую функцию в сочетании с 'with' и' g'. Благодаря! – bfoste01

+1

Или вы хотите что-то вроде 'tabs <- with (g, table (response, Item, School)); для (x in 1: dim (вкладки) [3]) вкладки [,, x] <- prop.table (вкладки [,, x], 2) * 100; tabs' - пропорции в школе? Ну, у тебя все получилось, как кажется. ;) – lukeA

+0

Если у вас есть время (и я думаю, что это добавит к интерпретируемому значению ответа). Можете ли вы просто объяснить, что происходит с этим фрагментом кода: 'tabs <- with (g, table (response, Item, School)); для (x in 1: dim (вкладки) [3]) вкладки [,, x] <- prop.table (вкладки [,, x], 2) * 100; вкладки. «Это прекрасно работает, и я адаптировал его ко всем ситуациям, в которых я нуждаюсь, но я бы солгал, если бы сказал, что понял, что это значит в полном объеме. – bfoste01

Смежные вопросы