0

次のようなデータフレームがあります。

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でのみvariabelesag(スコアは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パッケージは私が仕事をするのを助けることができるはずですが、私はまだそれを機能させることができていません。誰か助けてもらえますか?よろしくお願いします!

4

3 に答える 3

2

これが別のバージョンです。がない場合はstep = 5、の値score2_step = 0data.frameあなたがであると仮定してdf

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
于 2013-01-17T14:54:20.557 に答える
1

変数agと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

于 2013-01-17T14:19:16.020 に答える
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を作成しました(指定されたサンプルデータセットに値がなく、プレースホルダーが必要だったため)。var1c

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

tapplyscore1値のテーブルを作成します。

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

score2ステップ5の値を追加します。

data.frame(tab,subset(dat,step==5,select=score2))
于 2013-01-17T14:26:34.223 に答える