【问题标题】:Reshaping data in R . Is it possible to have two "value variables" [duplicate]在 R 中重塑数据。是否可以有两个“值变量”[重复]
【发布时间】:2012-09-08 08:32:49
【问题描述】:

我正在为 reshape 包苦苦挣扎,寻找一种“投射”数据框但在“value.var”中有两个(或更多)值的方法。

这是我想要实现的示例。

df <- data.frame( StudentID = c("x1", "x10", "x2", 
                            "x3", "x4", "x5", "x6", "x7", "x8", "x9"),
              StudentGender = c('F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'),
              ExamenYear    = c('2007','2007','2007','2008','2008','2008','2008','2009','2009','2009'),
              Exam          = c('algebra', 'stats', 'bio', 'algebra', 'algebra', 'stats', 'stats', 'algebra', 'bio', 'bio'),
              participated  = c('no','yes','yes','yes','no','yes','yes','yes','yes','yes'),  
              passed      = c('no','yes','yes','yes','no','yes','yes','yes','no','yes'),
              stringsAsFactors = FALSE)

从 df 我可以创建以下数据框:

tx <- ddply(df, c('ExamenYear','StudentGender'), summarize,
        participated = sum(participated      == "yes"),
        passed   = sum(passed      == "yes"))

在reshape逻辑中,我有两个“值变量”参与并通过了

我正在寻找将以下信息组合在一个数据框中的方法:

 dcast(tx, formula = ExamenYear ~ StudentGender, value.var = 'participated')
 dcast(tx, formula = ExamenYear ~ StudentGender, value.var = 'passed')

我试图创建的茶几看起来像这样

tempTab1 <- dcast(tx, formula = ExamenYear ~ StudentGender, value.var = 'participated')
tempTab2 <- dcast(tx, formula = ExamenYear ~ StudentGender, value.var = 'passed')

as.data.frame(cbind(ExamenYear = tempTab1[,1],
                Female_Participated = tempTab1[,2],
                Female_Passed       = tempTab2[,2],
                Male_Participated    = tempTab1[,3],
                Male_Passed          = tempTab2[,3]
                ))

是否可以在强制转换函数中有两个“值变量”?

【问题讨论】:

    标签: r plyr reshape


    【解决方案1】:

    既然你已经走到这一步,为什么不melt你的tx对象并使用dcast如下:

    dcast(melt(tx, id.vars=c(1, 2)), ExamenYear ~ StudentGender + variable)
    #   ExamenYear F_participated F_passed M_participated M_passed
    # 1       2007              1        1              1        1
    # 2       2008              1        1              2        2
    # 3       2009             NA       NA              3        2
    

    然而,更直接的方法可能是从一开始就melt您的数据:

    df.m <- melt(df, id.vars=c(1:4))
    dcast(df.m, ExamenYear ~ StudentGender + variable, 
          function(x) sum(x == "yes"))
    #   ExamenYear F_participated F_passed M_participated M_passed
    # 1       2007              1        1              1        1
    # 2       2008              1        1              2        2
    # 3       2009              0        0              3        2
    

    更新:基本 R 方法

    虽然所需的代码没有那么“漂亮”,但在基础 R 中执行此操作也不是太难。这是一种方法:

    1. 使用aggregate() 从您的示例中获取tx

      dfa <- aggregate(cbind(participated, passed) ~ 
        ExamenYear + StudentGender, df, function(x) sum(x == "yes"))
      dfa
      #   ExamenYear StudentGender participated passed
      # 1       2007             F            1      1
      # 2       2008             F            1      1
      # 3       2007             M            1      1
      # 4       2008             M            2      2
      # 5       2009             M            3      2
      
    2. 使用reshapedfa 从“长”转换为“宽”。

      reshape(dfa, direction = "wide", 
              idvar="ExamenYear", timevar="StudentGender")
      #   ExamenYear participated.F passed.F participated.M passed.M
      # 1       2007              1        1              1        1
      # 2       2008              1        1              2        2
      # 5       2009             NA       NA              3        2
      

    【讨论】:

    • 优秀。非常感谢。那行得通,我学到了一些关于重塑的新东西。我想我最初的问题没有意义,因为该物体首先没有熔化。还有一个问题:如果“变量”(参与/通过)中的变量具有不同的值(例如,0/1 表示参与,“是/否”表示通过)
    • @user1043144,未经测试,但您可能想尝试类似sum(x == "yes"|x == 1) 的方法。 | 表示“或”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2016-12-23
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多