преобразование сводки, созданной с использованием 'by', в data.frame - PullRequest
3 голосов
/ 23 февраля 2012
df1=data.frame(c(2,1,2),c(1,2,3,4,5,6),seq(141,170)) #create data.frame
names(df1) = c("gender","age","height") #column names
df1$gender <- factor(df1$gender,
levels=c(1,2),
labels=c("female","male")) #gives levels and labels to gender
df1$age <- factor(df1$age,
levels=c(1,2,3,4,5,6),
labels=c("16-24","25-34","35-44","45-54","55-64","65+")) # gives levels and labels to age groups

Я хочу получить сводную информацию о значениях высоты, заданных по полу, а затем по возрасту.

Использование функций subset и by, которые обеспечивают требуемый вывод:

females<-subset(df1,df1$gender==1) #subsetting by gender
males<-subset(df1,df1$gender==2)

foutput=by(females$height,females$age,summary) #producing summary subsetted by age
moutput=by(males$height,males$age,summary)

Однако мне требуется, чтобы он был в data.frame, чтобы я мог экспортировать эти результаты вместе с частотными таблицами, используя XLconnect.

Есть ли способ преобразовать вывод в data.frame или изящную альтернативу, возможно, с использованием plyr?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

Вот один из подходов с использованием plyr:

> ddply(df1, c("gender", "age"), function(x) summary(x$height))
  gender   age Min. 1st Qu. Median Mean 3rd Qu. Max.
1 female 25-34  142     148    154  154     160  166
2 female 55-64  145     151    157  157     163  169
3   male 16-24  141     147    153  153     159  165
4   male 35-44  143     149    155  155     161  167
5   male 45-54  144     150    156  156     162  168
6   male   65+  146     152    158  158     164  170
2 голосов
/ 23 февраля 2012

Выходные данные by на самом деле list, но они выглядят иначе из-за метода print.by.

Таким образом, вы можете использовать do.call до rbind элементов в matrix и затем вызовите data.frame для этого:

data.frame(do.call(rbind,by(mtcars$hp,mtcars$cyl,summary)),check.names=FALSE)
  Min. 1st Qu. Median   Mean 3rd Qu. Max.
4   52    65.5   91.0  82.64    96.0  113
6  105   110.0  110.0 122.30   123.0  175
8  150   176.2  192.5 209.20   241.2  335

Обратите внимание на использование аргумента check.names, чтобы избежать санации имен столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...