如何使用重塑包重塑我的数据帧?

时间:2013-01-17 13:14:21

标签: r reshape

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

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(它们的分数在得分1中)与得分2相关联,我认为我需要首先将我的数据集改为:

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软件包应该能够帮助我完成这项工作,但我还没能让它工作。 谁能帮我?提前谢谢了!

3 个答案:

答案 0 :(得分:2)

这是另一个版本。如果没有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

答案 1 :(得分:1)

看起来你想要变量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')

block中有一个额外的列(df2)可以摆脱或忽略。

答案 2 :(得分:0)

我在示例数据中添加了另一行,因为除非每个块中都有第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))