【问题标题】:How can I reshape my dataframe using reshape package?如何使用 reshape 包重塑我的数据框?
【发布时间】:2013-01-17 13:14:20
【问题描述】:

我有一个如下所示的数据框:

step  var1  score1  score2
1      a    0        0
2      b    1        1
3      d    1        1
4      e    0        0
5      g    0        0
1      b    1        1
2      a    1        0
3      d    1        0
4      e    0        1
5      f    1        1
1      g    0        1
2      d    1        1
etc.

因为我只需要在第 5 步中将变量 a-g(他们的分数在 score1 中)与 score2 关联起来,我认为我需要先将我的数据集更改为这个:

a   b   c   d   e   f   g   score2_step5
0   1       1   0       0   0
1   1       1   0   1       1
            1           0 
etc.

我很确定 Reshape 包应该能够帮助我完成这项工作,但我还不能让它发挥作用。 谁能帮我?提前谢谢了!

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    这是另一个版本。如果没有step = 5,则为score2_step = 0 的值。假设你的data.framedf

    require(reshape2)
    out <- do.call(rbind, lapply(seq(1, nrow(df), by=5), function(ix) {
        iy <- min(ix+4, nrow(df))
        df.b <- df[ix:iy, ]
        tt <- dcast(df.b, 1 ~ var1, fill = 0, value.var = "score1", drop=F)
        tt$score2_step5 <- 0
        if (any(df.b$step == 5)) {
            tt$score2_step5 <- df.b$score2[df.b$step == 5]
        }
        tt[,-1]
    }))
    
    > out
       a b d e f g score2_step5
    2  0 1 1 0 0 0            0
    21 1 1 1 0 1 0            1
    22 0 0 1 0 0 0            0
    

    【讨论】:

      【解决方案2】:

      看起来您希望变量 a-g 和 score2_step5 之间有 7 个相关性——对吗?首先,您将需要另一个变量。我假设step 从 1 到 5 连续重复;如果没有,这将更加复杂。我假设您的数据称为df。我也更喜欢更新的reshape2 包,所以我正在使用它。

      df$block <- rep(1:(nrow(df)/5),each=5)
      df.molten <- melt(df,id.vars=c("var1", "step", "block"),measure.vars=c("score1"))
      df2 <- dcast(df.molten, block ~ var1)
      score2_step5 <- df$score2[df$step==5]
      

      然后是最后

      cor(df2, score2_step5, use='pairwise')
      

      df2 中有一个额外的列 (block),您可以删除或忽略。

      【讨论】:

        【解决方案3】:

        我在您的示例数据中添加了另一行,因为除非在每个块中都有第 5 步观察,否则我的代码将不起作用。

        dat <- read.table(textConnection("
        step  var1  score1  score2
        1      a    0        0
        2      b    1        1
        3      d    1        1
        4      e    0        0
        5      g    0        0
        1      b    1        1
        2      a    1        0
        3      d    1        0
        4      e    0        1
        5      f    1        1
        1      g    0        1
        2      d    1        1
        5      a    1        0"),header=TRUE)
        

        与@JonathanChristensen 一样,我创建了另一个变量(我将其称为rep 而不是block),并将var1 设置为一个因子(因为在给定的示例数据集中没有c 值和我想要一个占位符)。

        dat <- transform(dat,var1=factor(var1,levels=letters[1:7]),
                         rep=cumsum(step==1))
        

        tapply 制作score1 值的表格:

        tab <- with(dat,tapply(score1,list(rep,var1),identity))
        

        添加score2,第5步值:

        data.frame(tab,subset(dat,step==5,select=score2))
        

        【讨论】:

          猜你喜欢
          • 2012-02-09
          • 1970-01-01
          • 1970-01-01
          • 2019-10-17
          • 1970-01-01
          • 2020-07-29
          • 2021-02-15
          • 2013-10-29
          • 1970-01-01
          相关资源
          最近更新 更多