【问题标题】:Melt/dcast/melt with margins not workingMelt/dcast/melt 边距不起作用
【发布时间】:2012-11-02 19:56:25
【问题描述】:

我有一个数据框定义如下(实际上有 200 多个变量):

class_level var1 var2
          1    4    7
          1    6    7
          1    7    6
          4    3    1
          4    1    3

其中 class_level 为 1 或 4,var1 和 var2 的值为 1-7,这是来自调查的类李克特响应级别。

我想要一个数据框,其中包含每个 var 按类级别的级别计数,每个变量都有一个总计行,例如:

class_level variable Levels Students
          1     var1      1       10  
          1     var1      2        7  
          1     var1      3       28  
          1     var1      4       15  
          1     var1      5       54  
          1     var1      6       38  
          1     var1      7       16
          1     var1  Total      168  
          4     var1      1       58
          .        .      .        .
          .        .      .        .
          .        .      .        .
          4     var1      7       33
          4     var1  Total      294  

我尝试了以下方法:

df.m <- melt( df, id.vars=c("class_level"), na.rm=TRUE )
head(df.m)
#  class_level variable value
#1           4     var1     4
#2           4     var1     6
#3           1     var1     7
#4           4     var1     3
#5           1     var1     5
#6           4     var1     6

df.c <- dcast( df.m, class_level+variable ~ value,
               fun.aggregate=length, 
               subset=.(variable %in% c("var1","var2")),
               margins=TRUE
             )
head(df.c)
#  class_level variable 1 2  3  4  5   6   7 (all)
#1           1     var1 1 1  8 24 56 101  32   223
#2           1     var2 2 4  4 22 49  79  56   216
#3           4     var1 4 5 11 38 91 114  76   339
#4           4     var2 2 6 11 35 73  98 106   331

df.o <- melt( df.c, id.vars=c("class_level","variable"),
              variable.name="Levels", value.name="Students"
            )
head(df.o)
#  class_level variable Levels Students
#1           1     var1      1        1
#2           1     var2      1        2
#3           4     var1      1        4
#4           4     var2      1        2
#5           1     var1      2        1
#6           1     var2      2        4

如您所见,这会按级别为每个变量生成计数,但不会生成总计行。如何获取最终数据集 (df.o) 中的总计行。任何帮助将不胜感激。

大卫

【问题讨论】:

  • 请提供good reproducible example 以及期望的结果。我不是 100% 清楚你现在想要做什么。
  • 您可能只是在dcast 通话中错过了)
  • @joran - 是的,已更正。
  • 它适用于我,包括),但总行数都在底部。您只需对数据框进行排序。
  • @Dason,我在示例中添加了更多细节。这有帮助吗?

标签: r


【解决方案1】:

我倾向于使用plyr 来提供帮助:

df.m <- melt( df, id.vars=c("class_level"), na.rm=TRUE )
df.m$value <- factor(df.m$value, levels=1:7) # To ensure 0 counts as well
df.c <- ddply(df.m, .(class_level, variable),
             function(x) c(table(df.m$value), Total=length(df$m.value)))
df.o <- melt(df.c, id.vars=c("class_level", "variable"))

【讨论】:

  • 刚刚看到@joran 的评论:看起来 OP 的代码毕竟可以工作!
  • 啊,但是 OP 会通知...吗? :)
  • 在您的帮助下,希望如此!
  • 是的,谢谢@joran。我看到它现在可以工作了。我不确定我最初在做什么,但很明显,当我清理它以解释它时,我“修复”了我做错的任何事情。
猜你喜欢
  • 2015-12-12
  • 1970-01-01
  • 2016-07-28
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2012-04-03
相关资源
最近更新 更多