2013-06-23 65 views
1

我試圖創造的(鍵,值)對的聚集列表數據:[R骨料(鍵,值)每

d <- data.frame(key.1 = c(1,1), 
       val.1 = c(100,100), 
       key.2 = c(1,1), 
       val.2 = c(100,100), 
       key.3 = c(2,3), 
       val.3 = c(100,100)) 

key.1 val.1 key.2 val.2 key.3 val.3 
    1 100  1 100  2 100 
    1 100  1 100  3 100 

,我希望得到的結果是:

key.1 val.1 key.2 val.2 
    1 200  2 100 
    1 200  3 100 

含義是(1100)和(1100)獲得基於共同1聚集,其價值是在第2行中的第一行和(3100)在總結,以200。(2 100)保持原樣,因爲與另一對沒有共同的密鑰。

不像this question,在我的情況我已經聚集我的數據幀分別的每一行。目前我只是逐行迭代,併爲每一行使用「聚合」。有沒有更聰明的方法來做到這一點?

+0

你可以'輸入'你的數據樣本。這不是一個非常明確的措辭問題。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto:增加了一個樣本。 thx爲suggsetion – zuuz

回答

2

這裏是讓你你正在尋找的價值,儘管在比你在你的榜樣輸出指定的格式稍有不同的解決方案:

  1. 創建基於一個「ID」 rownames,因爲你想在結束行彙總...

    d$ID <- rownames(d) 
    
  2. 從「寬」將您的數據爲「長」格式,採用reshape

    temp <- reshape(d, direction = "long", idvar="ID", 
           varying = setdiff(names(d), "ID")) 
    
    temp 
    #  ID time key val 
    # 1.1 1 1 1 100 
    # 2.1 2 1 1 100 
    # 1.2 1 2 1 100 
    # 2.2 2 2 1 100 
    # 1.3 1 3 2 100 
    # 2.3 2 3 3 100 
    
  3. aggregate使用按行(ID)和密鑰(鍵)的組合來計算的總和。另外,根據原始ID的「組」創建第二個「ID」。再次

    temp1 <- aggregate(val ~ ID + key, temp, sum) 
    temp1 <- within(temp1, { 
        ID2 <- ave(ID, ID, FUN = seq_along) 
    }) 
    temp1 
    # ID key val ID2 
    # 1 1 1 200 1 
    # 2 2 1 200 1 
    # 3 1 2 100 2 
    # 4 2 3 100 2 
    
  4. 使用reshape要回一個「寬」的形式:

    ​​
+0

是的,大小應該是val。這是一個錯字。關於你的其他答案 - 我仍然在讀它.. – zuuz

+1

@zorbar,這是星期天,我現在沒有任何工作要做,所以我會慷慨地給出完整的答案。 – A5C1D2H2I1M1N2O1R2T1

+0

非常感謝,我會立即深入您的代碼。 – zuuz

0

爲了使這成爲可能,數據首先需要轉換爲「整齊」的格式。每個鍵和每個val實際上是相同的變量,並且您希望通過鍵和另一個未明確編碼的變量列進行聚合。該數據應安排是這樣的:

d <- data.frame(key = c(1,1,1,1,2,3), 
      val = c(100,100,100,100,100,100), 
      keycol = c(1,1,2,2,3,3)) 

其中給出

key val keycol 
# 1 100  1 
# 1 100  1 
# 1 100  2 
# 1 100  2 
# 2 100  3 
# 3 100  3 

現在只需通過彙總和keykeycol獲得期望的結果。我喜歡dplyr

library(dplyr) 
d %>% group_by(key, keycol) %>% summarise(sum(val)) 

這給了你想要的,以正確形式的結果。

 key keycol sum(val) 
    (dbl) (dbl) (dbl) 
#1  1  1  200 
#2  1  2  200 
#3  2  3  100 
#4  3  3  100