简化创建汇总表的过程

Ber*_*iss 3 r

我很确定我的事情变得复杂了.我有一个带p变量的数据框(这里v1v3:)和两个因子变量(这里:sexunemp):

> head(df)
  sex unemp v1 v2 v3
1   0     0  2  4  4
2   0     0  2  1  1
3   1     0  3  3  5
4   1     1  2  3  5
5   0     0  1  2  5
6   1     0  3  5  4
Run Code Online (Sandbox Code Playgroud)

我现在想修改(即计算中位数和平均值,然后重新排列汇总表)我的数据,使得结果数据框看起来像这样(对于男性或女性):

> df.res.men
   median.unemp.1 median.unemp.0 mean.unemp.1 mean.unemp.0
v1            2.0            2.0     2.666667     2.391304
v2            2.0            3.5     2.500000     3.369565
v3            4.5            3.0     4.166667     2.956522
Run Code Online (Sandbox Code Playgroud)

这是完整的代码:

library(plyr)
## generate data
set.seed(1)
df <- data.frame(sex=rbinom(100, 1, 0.5),
                 unemp=rbinom(100, 1, 0.2),
                 v1=sample(1:5, 100, replace=TRUE),
                 v2=sample(1:5, 100, replace=TRUE),
                 v3=sample(1:5, 100, replace=TRUE)
                 )
head(df)

## compute mean and median for all variables by sex and unemp
df.mean <- ddply(df, .(unemp, sex), .fun=colMeans, na.rm=TRUE)
df.mean
df.median <- ddply(df, .(unemp, sex), .fun=function(x)apply(x,2,median, na.rm=TRUE))
df.median

## rearrange summary table
df.res.men <- cbind(t(subset(df.median, sex==0 & unemp==1)),
                 t(subset(df.median, sex==0 & unemp==0)),
                 t(subset(df.mean, sex==0 & unemp==1)),
                 t(subset(df.mean, sex==0 & unemp==0)))
df.res.men <- df.res.men[-c(1:2),]
colnames(df.res.men) <- c("median.unemp.1", "median.unemp.0", 
                          "mean.unemp.1", "mean.unemp.0")
df.res.men
Run Code Online (Sandbox Code Playgroud)

Ram*_*ath 5

这是一种方法

library(plyr); library(reshape2)
dfm <- melt(df, id = c('sex', 'unemp'))
df2 <- ddply(dfm, .(variable, unemp, sex), summarize, 
  avg = mean(value), med = median(value))

df2m <- melt(df2, id = 1:3, variable.name = 'sum_fun')
df_0 <- dcast(df2m, sex + variable ~ sum_fun + unemp, subset = .(sex == 0))

   sex variable    avg_0  avg_1 med_0 med_1
1   0       v1 2.794872 3.0000     3   3.5
2   0       v2 3.102564 2.8750     3   3.0
3   0       v3 3.205128 3.1875     3   4.0
Run Code Online (Sandbox Code Playgroud)