2013-02-17 7 views
1

У меня есть dataframe х, как этотDdply и резюме категориальных переменных

Id Group Var1 
001 A  yes 
002 A  no 
003 A  yes 
004 B  no 
005 B  yes 
006 C  no 

Я хочу, чтобы создать фрейм данных как этот

Group yes no 
A  2  1 
B  1  1 
C  0  1 

Функция .aggregate хорошо работает

aggregate(x$Var1 ~ x$Group,FUN=summary) 

, но я не могу создать dataframe с результатами.

Если я пытаюсь использовать .ddply

ddply(x,"Group",function(x) summary(x$Var1)) 

я получаю ошибку: Результаты не имеют одинаковую длину.

Что я делаю неправильно?

Спасибо.

+0

Это работает для меня. Какую версию plyr вы используете? – agstudy

+0

'ddply (x," Group ", функция (x) summary (x $ Var1))' отлично работает для меня –

+0

Это работает и для меня! –

ответ

3

Я представляю Ч в данных

dat <- read.table(text = 'Id Group Var1 
001 A  yes 
002 A  no 
003 A  NA  ## here! 
004 B  no 
005 B  yes 
006 C  no',head = T) 

Вы должны удалить NA, прежде чем резюме, потому что резюме создать столбец для NA и aggregate методы формулы настройки по умолчанию na.action = na.omit которая исключала бы дополнительный NA» колонка. Вот обходной путь, я удалить НС до резюме:

library(plyr) 
    ddply(dat,"Group",function(x) { 
    x <- na.omit(x$Var1) 
    y <- summary(x) 
}) 
Group no yes 
1  A 1 1 
2  B 1 1 
3  C 1 0 

который equiavlent к

x <- dat 
aggregate(x$Var1 ~ x$Group,FUN=summary) 
    x$Group x$Var1.no x$Var1.yes 
1  A   1   1 
2  B   1   1 
3  C   1   0 
+1

+1. Возможно, было бы полезно указать, что метод 'aggregate' formula имеет значение по умолчанию' na.action = na.omit ', которое учитывало бы различие (или, скорее, сходство) между двумя подходами. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Well Я добавлю это. Я не очень хорошо знаю функцию 'aggregate'. – agstudy

+0

Отличное объяснение, спасибо! – corrado

4

Это не отвечает на вопрос о ddply, но это должно помочь вам с вашим aggregate выходом. Второй столбец в общей команде, которую вы использовали, является матрицей, но вы можете обернуть весь вывод в операторе do.call(data.frame..., чтобы вместо этого получить кадр данных. Если предположить, что data.frame называется "mydf":

temp <- do.call(data.frame, aggregate(Var1 ~ Group, mydf, summary)) 
temp 
# Group Var1.no Var1.yes 
# 1  A  1  2 
# 2  B  1  1 
# 3  C  1  0 
str(temp) 
# 'data.frame': 3 obs. of 3 variables: 
# $ Group : Factor w/ 3 levels "A","B","C": 1 2 3 
# $ Var1.no : int 1 1 1 
# $ Var1.yes: int 2 1 0 

В качестве альтернативы, вы можете посмотреть на table:

table(mydf$Group, mydf$Var1) 
#  
#  no yes 
# A 1 2 
# B 1 1 
# C 1 0 
as.data.frame.matrix(table(mydf$Group, mydf$Var1)) 
# no yes 
# A 1 2 
# B 1 1 
# C 1 0 
+0

Спасибо, это работает очень хорошо! – corrado

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