2013-01-17 62 views
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. 

,因爲我需要相關variabeles AG(他們的成績都在score1)與唯我想我需要schange我的數據集到這個第一步5 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. 

我敢肯定的是,整形包裝應該能夠幫我做這份工作,但我一直沒能使其工作還沒有。 任何人都可以幫助我嗎?提前謝謝了!

回答

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

看起來你想要7個變量a-g和score2_step5之間的相關性 - 是否正確?首先,你將需要另一個變量。我假設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),您可以擺脫或忽略。

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,我提出另一個變量(I稱之爲rep代替block)和I製成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))