2013-05-20 56 views
0

我有一個數據幀:數據幀到矩陣而不使用重塑

set.seed(1234) 
mydata <- data.frame(d1=strsplit("AAABBCCCCCDD", "")[[1]], 
d2=rnorm(12), d3=c("aba", "bbc", "ccb", "aba", "bbc", "ccb", "aba", "aba", "ccb", "bbc", "aba", "bbc"), 
d4=c(101:103, 201:202, 301:305, 401:402)) 

,我想通過含有在每個D1每個d3的總和D3 D1的矩陣。

我可以使用軟件包重塑,但問題是我使用R 3.0,並沒有它的重塑版本。

有什麼建議嗎? 乾杯!

+0

你總結了哪些東西? d2和d4都是數字... – Frank

+0

您可以使用'reshape2'包來替換'reshape'嗎? – Gregor

+1

嗯,重塑在R 3.0.0中工作正常 – hadley

回答

2

首先,重塑(和reshape2)與R 3.0一起工作良好。其次,我假設你正在總結d2,而不是d3。您可以使用plyr

require(plyr) 
ddply(mydata, .(d1), summarise, d2=sum(d2)) 
+0

是的,對不起!我在總結d2!我想我的R版本有問題! – AEM

2

這樣做,無論你想要哪個變量。只需將d2切換到d4即可。

tapply(mydata$d2,mydata[,c("d1","d3")],sum) 

結果是...

d3 
d1   aba  bbc   ccb 
    A -1.2070657 0.2774292 1.08444118 
    B -2.3456977 0.4291247   NA 
    C -1.1213718 -0.8900378 -0.05839611 
    D -0.4771927 -0.9983864   NA 
+0

您的答案和@Ananda確實有效!但這是一個矩陣,也不是數據框!如果我嘗試as.data.frame,它會回到以前的狀態! – AEM

+0

我看到'is.matrix(tapply(mydata $ d2,mydata [,c(「d1」,「d3」)],sum))'出現爲'TRUE'(對於Ananda Mahto的解決方案也是一樣的) 。也許你的意思是「矩陣」比標準的R含義還要別的...? – Frank

+0

@ user2335669,如果我在Frank的答案中使用'as.data.frame',我會得到一個'data.frame'。爲了從我的答案中獲得'data.frame',你必須使用'as.data.frame.matrix'而不是'as.data.frame'。 – A5C1D2H2I1M1N2O1R2T1

2

正如其他人所指出的,你的問題是不明確的。如果你只在sum作爲聚合功能感興趣,那麼你可以簡單地使用xtabs

> xtabs(d2 ~ d1 + d3, mydata) 
    d3 
d1   aba   bbc   ccb 
    A -1.20706575 0.27742924 1.08444118 
    B -2.34569770 0.42912469 0.00000000 
    C -1.12137182 -0.89003783 -0.05839611 
    D -0.47719270 -0.99838644 0.00000000 

要回到一個data.frame,包住整個事情as.data.frame.matrix(不只是as.data.frame):

> as.data.frame.matrix(xtabs(d2 ~ d1 + d3, mydata)) 
     aba  bbc   ccb 
A -1.2070657 0.2774292 1.08444118 
B -2.3456977 0.4291247 0.00000000 
C -1.1213718 -0.8900378 -0.05839611 
D -0.4771927 -0.9983864 0.00000000