我有像这样的数据框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))
我得到错误:结果没有相同的长度。
我做错了什么?
感谢。
答案 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