1

我有一个这样的数据框 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))

我得到错误:结果的长度不相等。

我究竟做错了什么?

谢谢。

4

2 回答 2

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
于 2013-02-17T15:53:51.807 回答
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)

您需要在 summary 之前删除 NA ,因为 summary 为 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
于 2013-02-17T15:42:17.707 回答