r - 简化创建汇总表的过程

标签 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

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

> 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

这里是完整的代码:

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

最佳答案

这是一种方法

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

关于r - 简化创建汇总表的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460982/

相关文章:

css - R:突出显示 Shiny 的数据表

r - 数据如何从 react 性 Shiny 表达式传递到 ggvis 图?

r - 时间序列插值: monthly data to certain day frequency data

R data.table二进制值,按条件分组的最后一行

r - 识别一组计数中的索引号

r - 为r中的每个组创建日期序列

将 cos^..(...) 替换为 (cos(...))^

r - 黄土复制 geom_smooth 的置信区间/带

r - 如何将 geom_text 颜色映射到变量

r - DPLYR - 使用列值作为条件将行合并在一起