2013-05-20 56 views
5

我試圖做一個簡單的reshape,使test這個樣子的:簡單重塑導致錯誤

a_estimate, a_tstat, b_estimate, b_tstat 
1,   3,  2,   4 

這是我嘗試代碼:

require(reshape2) 
test = data.frame(cf=c("a", "b"), estimate=c(1,2), tstat=c(3,4)) 
m = melt(test, id.vars="cf") 
d = dcast(m, formula = . ~ cf + variable) 
Error: nrow(res$labels[[1]]) == nrow(data) is not TRUE 

這是怎麼回事這裏?

> sessionInfo()  
R version 2.15.2 (2012-10-26) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] reshape2_1.2.2 

loaded via a namespace (and not attached): 
[1] plyr_1.8  stringr_0.6.2 
+0

如果目的是從'M'恢復'test'然後你想:'dcast(男,CF〜變量, value.var =「value」)' –

+0

@ G.Grothendieck:我不確定我是否遵循,目標是讓測試看起來像問題的第二行。 – Alex

+0

試試這個:'dcast(m,1〜cf + variable)' –

回答

6

也許你的問題是,你有有效的零「行」變量(即你根本不需要任何關於鑄造公式的LHS)。這種解決方法(添加一個虛擬變量)可能有幫助嗎?

d = dcast(cbind(x=1,m), formula = x ~ cf + variable) 
+0

yes這個解決了它..這肯定是一個bug? – Alex

+1

我不確定它是否是技術上的錯誤 - 必須仔細查看規範/文檔以查看是否討論了零變量左情況。如果沒有提及,那麼這是「未定義的行爲」,而不是一個錯誤...(軟件沒有做你想做的事情,在設計者沒有考慮的情況下,不一定構成bug。) –

5

這裏的基礎R的方式,爲樂趣...

reshape(transform(test, id=1), idvar='id', timevar='cf', direction='wide')[-1] 
# estimate.a tstat.a estimate.b tstat.b 
# 1   1  3   2  4 
+0

謝謝!因爲我習慣了它,所以我希望堅持這個包,但是我應該儘可能使用base R功能。 – Alex