按多个变量的因子水平汇总统计

Summary stats by factor level for multiple variables

我想生成包含多个变量的每个因子水平的汇总统计数据的数据框。

例如,如果我有以下数据框

Factor <- c("A","A","A","B","B","B")
Variable1 <- c(3,4,5,4,5,3)
Variable2 <- c(7,9,14,16,10,10)
mydf <- data.frame(Factor, Variable1, Variable2)
mydf
  Factor Variable1 Variable2
1      A         3         7
2      A         4         9
3      A         5        14
4      B         4        16
5      B         5        10
6      B         3        10

并且我有以下函数可用于生成我的摘要统计信息:

my.summary <- function(x, na.rm=TRUE){result <- c(n=as.integer(length(x)),
Mean=mean(x, na.rm=TRUE), SD=sd(x, na.rm=TRUE), SeM = SEM(x),
Median=median(x),   Min=min(x), Max=max(x))}

要将其应用于 Variable1 的因子水平,我可以这样做:

ddply(mydf, c("Factor"), function(x) my.summary(x$Variable1))
  Factor n Mean SD       SeM Median Min Max
1      A 3    4  1 0.5773503      4   3   5
2      B 3    4  1 0.5773503      4   3   5

现在我可以对变量 2 做同样的事情了:

ddply(mydf, c("Factor"), function(x) my.summary(x$Variable2))

如果我只有 2 个变量,这就足够简单了。但是,如果我有很多变量,这会很痛苦。那么我该如何解决这个问题,以便我可以在不调整代码的情况下为每个 variable/factor 级别生成汇总统计数据的数据框?

我试过使用 aggregate.data.frame,但使用 my.summary 无效。它使用摘要工作,但会产生一个大数据框。

谢谢

您可以使用 dplyr 中的 summarise_each:

library(dplyr)

mydf %>% group_by(Factor) %>%
         summarise_each(funs(my.summary(.)))

将函数修改为 return 列表后:

my.summary <- function(x, na.rm=TRUE){result <- list(c(n=as.integer(length(x)),
                                                  Mean=mean(x, na.rm=TRUE), SD=sd(x, na.rm=TRUE),
                                                  Median=median(x),   Min=min(x), Max=max(x)))}

你可以先融化你的数据:

library(reshape2)

df <- melt(mydf,id.vars = 1)
df1 <- ddply(df, c("Factor","variable"), function(x) my.summary(x$value))

如果您想按不同的变量拆分数据,您可以使用 split():

df2 <- split(df1,df1$variable)

如果你想要全局环境中的那些拆分数据框,你可以使用 list2env() 这将创建两个新的数据框,Variable1Variable2(如果你有更多,则更多)变量):

list2env(df2,.GlobalEnv)

我们可以使用data.table

library(data.table)
 setDT(mydf)[, unlist(lapply(.SD, my.summary),recursive=FALSE), Factor]
 my.summary <- function(x, na.rm=TRUE){list(n= length(x),
                                  Mean=mean(x),
                                  SD=sd(x),
                                  Median=median(x), 
                                  Min=min(x),
                                  Max=max(x))}