Ddply和分类变量的摘要

时间:2013-02-17 15:38:44

标签: r aggregate plyr

我有像这样的数据框x

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)

但我无法使用结果创建数据框。

如果我尝试使用.ddply

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

我得到错误:结果没有相同的长度。

我做错了什么?

感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我在您的数据中引入了NA

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'列。这是一个解决方法,我在摘要之前删除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

等同
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