2013-01-13 34 views
0

我正在嘗試使用R將行聚合到列。這是我的數據集的一個樣本。將聚合行重新整形爲新列,分類數據

age sex hash        emotion  color 
22 1 b17f9762462b37e7510f0e6d2534530d Lonely  #006666 
22 1 b17f9762462b37e7510f0e6d2534530d Energetic #66CC00 
22 1 b17f9762462b37e7510f0e6d2534530d Calm  #FFFFFF 
22 1 b17f9762462b37e7510f0e6d2534530d Angry  #FF0000 
24 1 7bb50ca97a9b517239b39440a966d2f6 Calm  #006666 
24 1 7bb50ca97a9b517239b39440a966d2f6 Excited  #0033cc 
24 1 7bb50ca97a9b517239b39440a966d2f6 Empty/void #999999 
24 1 7bb50ca97a9b517239b39440a966d2f6 No emotion #FF6600 
26 1 209f1ba8ef86e855deccc0aae120825c Comfortable #330066 
21 1 b9e9309c0b1255a7efb2edf9ba66ae46 Energetic #330099 
21 1 b9e9309c0b1255a7efb2edf9ba66ae46 Happy  #330066 
26 1 209f1ba8ef86e855deccc0aae120825c No emotion #FFCC00 
26 1 209f1ba8ef86e855deccc0aae120825c Calm  #006666 
21 1 61debd3dea6d1aacce5c9fc7daec4fe5 Empty/void #FFFFFF 
21 1 b9e9309c0b1255a7efb2edf9ba66ae46 Calm  #006666 
26 1 209f1ba8ef86e855deccc0aae120825c No emotion #339900 
21 1 61debd3dea6d1aacce5c9fc7daec4fe5 Loved  #FF6600 
26 1 209f1ba8ef86e855deccc0aae120825c No emotion #66CC00 

我想要做的就是讓這樣的:

age sex hash   #000000 #FF0000 ... #FFFFFF 
22 1 8798tkojstwz9ei sad  happy ... loved 
... 

一個響應由哈希定義,相關的數據是年齡和性別。

我想讓每個響應爲1而不是幾列。每種顏色都應該有自己的列和相關情感作爲該列的值。

整個數據集有13種顏色,20多種情緒和1000多種響應。數據集與樣本完全一致,並存儲在mySQL數據庫中。

我已經嘗試過重塑,但它與分類數據不能很好地發揮作用,或者我沒有使用適當的功能。有任何想法嗎?如果需要,它可以包含一些mySQL準備。 Java在這裏非常緩慢,並且因爲我有12k +行R聽起來像是正確的事情。

謝謝。

+2

我不認爲'aggregate'是這個問題的一個合適的標題(或標籤)。你能否考慮將問題重新提交給更準確地描述問題所在的地方? – A5C1D2H2I1M1N2O1R2T1

+0

當然,你有什麼建議? – Alan

+0

不確定!這一切都取決於你卡在哪裏,因爲如果嘗試類似的任務,其他人可能會陷入困境。更準確的標題和標籤將增加這些用戶找到他們正在尋找的答案的機會。順便說一句,歡迎來到SO! – A5C1D2H2I1M1N2O1R2T1

回答

1

如果我理解你的目標正確,reshape()確實是你正在尋找的功能。假設你的數據集被稱爲mydf,試試這個:

reshape(mydf, direction = "wide", 
     idvar = c("hash", "age", "sex"), 
     timevar = "color") 
# age sex        hash emotion.#006666 emotion.#66CC00 
# 1 22 1 b17f9762462b37e7510f0e6d2534530d   Lonely  Energetic 
# 5 24 1 7bb50ca97a9b517239b39440a966d2f6   Calm   <NA> 
# 9 26 1 209f1ba8ef86e855deccc0aae120825c   Calm  No emotion 
# 10 21 1 b9e9309c0b1255a7efb2edf9ba66ae46   Calm   <NA> 
# 14 21 1 61debd3dea6d1aacce5c9fc7daec4fe5   <NA>   <NA> 
# emotion.#FFFFFF emotion.#FF0000 emotion.#0033cc emotion.#999999 emotion.#FF6600 
# 1    Calm   Angry   <NA>   <NA>   <NA> 
# 5    <NA>   <NA>   Excited  Empty/void  No emotion 
# 9    <NA>   <NA>   <NA>   <NA>   <NA> 
# 10   <NA>   <NA>   <NA>   <NA>   <NA> 
# 14  Empty/void   <NA>   <NA>   <NA>   Loved 
# emotion.#330066 emotion.#330099 emotion.#FFCC00 emotion.#339900 
# 1    <NA>   <NA>   <NA>   <NA> 
# 5    <NA>   <NA>   <NA>   <NA> 
# 9  Comfortable   <NA>  No emotion  No emotion 
# 10   Happy  Energetic   <NA>   <NA> 
# 14   <NA>   <NA>   <NA>   <NA> 

如果需要,您可以稍後重命名列。

+0

下一次我會用重塑解決方案擊敗你:) – agstudy

+0

@agstudy,你說的是base R還是「reshape2」;) - 無論如何,我認爲總有一些答案向OP展示OP有好處可用。 – A5C1D2H2I1M1N2O1R2T1

+0

按預期工作:)謝謝! – Alan

2

使用reshape2

dcast(dat,...~color,value.var='emotion') 
    age sex        hash #0033cC#006666  #330066 #330099 #339900 #66CC00 #999999 #FF0000 #FF6600 
1 21 1 61debd3dea6d1aacce5c9fc7daec4fe5 <NA> <NA>  <NA>  <NA>  <NA>  <NA> <NA> <NA>  Loved 
2 21 1 b9e9309c0b1255a7efb2edf9ba66ae46 <NA> Calm  Happy Energetic  <NA>  <NA> <NA> <NA>  <NA> 
3 22 1 b17f9762462b37e7510f0e6d2534530d <NA> Lonely  <NA>  <NA>  <NA> Energetic <NA> Angry  <NA> 
4 24 1 7bb50ca97a9b517239b39440a966d2f6 Excited Calm  <NA>  <NA>  <NA>  <NA> Empty <NA> Noemotion 
5 26 1 209f1ba8ef86e855deccc0aae120825c <NA> Calm Comfortable  <NA> Noemotion Noemotion <NA> <NA>  <NA> 
    #FFCC00 #FFFFFF 
1  <NA> Empty 
2  <NA> <NA> 
3  <NA> Calm 
4  <NA> <NA> 
5 Noemotion <NA> 
+0

當我使用你的函數時,我得到以下警告:「缺少聚合函數:默認爲長度」。結果是一個表格,其值爲1和0,而不是分類情感值。 – Alan

+0

@frinx輸出顯示它適用於我。你正在使用哪個版本的reshape2?這也取決於我如何閱讀你的數據。你可以輸入(head(dat))來測試嗎? – agstudy

+0

我剛下載並安裝了reshape2,所以它應該是最新的。輸入(頭(dat))輸出:結構(列表(年齡= c(22L,22L,22L,22L,22L,22L),sex = c(1L, 1L,1L,1L,1L,1L)結構(c(679L,679L,679L, 679L,679L,679L),.Label = c([哈希列表])),class =「因子」),情感=結構(c(16L,10L,4L, ),顏色=結構(c(3L,8L,2L,5L,6L,12L),。標籤= c([情感列表]), [顏色列表]),class =「factor」)),.Names = c(「age」,「sex」,「hash」,「emotion」,「color」),row.names = c(NA,6L ),class =「data.frame」) – Alan

相關問題