按多个变量的因子水平汇总统计
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()
这将创建两个新的数据框,Variable1
和 Variable2
(如果你有更多,则更多)变量):
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))}
我想生成包含多个变量的每个因子水平的汇总统计数据的数据框。
例如,如果我有以下数据框
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()
这将创建两个新的数据框,Variable1
和 Variable2
(如果你有更多,则更多)变量):
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))}