2015-05-28 76 views
1

我想縮短一段代碼,使其更快,更容易修改。這是我的數據的一個簡短例子。聚合所有可能的獨特組合與觀察在同一列中R

order obs year var1 var2 var3 
1  3 1 1 32 588 NA 
2  4 1 2 33 689 2385 
3  5 1 3 NA 678 2369 
4  33 3 1 10 214 1274 
5  34 3 2 10 237 1345 
6  35 3 3 10 242 1393 
7  78 6 1 5 62 NA 
8  79 6 2 5 75 296 
9  80 6 3 5 76 500 
10 93 7 1 NA NA NA 
11 94 7 2 4 86 247 
12 95 7 3 3 54 207 

基本上,我想爲R找到兩個值(觀察)的任何可能的和獨特的組合柱「OBS」,在同一年度內,以創建觀察是聚集了新的矩陣或DF的原件。順序並不重要,所以1 + 6 = 6 + 1。例如,有150個觀測值,我預計有11,175個可行組合(每年)。

我有些想要的基本代碼,但是,正如你所看到的,這樣做太長了(我已經建立了66種不同的新數據集,所以它沒有真正意義),我想知道如何縮短它。我做了一些試驗(plyr,...),但沒有取得真正的成功。在這裏我所做的:

# For the 1st year, groups of 2 obs 
newmatrix <- data.frame(t(combn(unique(data$obs[data$year==1]), 2))) 
colnames(newmatrix) <- c("obs1", "obs2") 
newmatrix$name <- do.call(paste, c(newmatrix[c("obs1", "obs2")], sep = "_")) 
# and the aggregation of var. using indexes, which I will skip here to save your time :) 

要ilustrate,這裏的結果,考慮的是什麼,我會得到第1年以上的樣本。 NA是因爲我只計算2個值有效的那些。而且,只有變量1和3的更多,我做的總和,但它可以是任何其他可能的功能:

order obs1 obs2 year var1 var3 
1  1 1 3 1_3 42 NA 
2  2 1 6 1_6 37 NA 
3  3 1 7 1_7 NA NA 
4  4 3 6 3_6 15 NA 
5  5 3 7 3_7 NA NA 
6  6 6 7 6_7 NA NA 

至於第三年的2條第一線,同類型的矩陣:

order obs1 obs2 year var1 var3 
1  1 1 3 1_3 NA 3762 
2  2 1 6 1_6 NA 2868 
.......... etc ............ 

我希望我解釋一下自己。預先感謝您提示如何更有效地做到這一點。

回答

2

我會用拆分申請,結合逐年分裂,發現所有的組合,再結合到一起:

do.call(rbind, lapply(split(data, data$year), function(x) { 
    p <- combn(nrow(x), 2) 
    data.frame(order=paste(x$order[p[1,]], x$order[p[2,]], sep="_"), 
      obs1=x$obs[p[1,]], 
      obs2=x$obs[p[2,]], 
      year=x$year[1], 
      var1=x$var1[p[1,]] + x$var1[p[2,]], 
      var2=x$var2[p[1,]] + x$var2[p[2,]], 
      var3=x$var3[p[1,]] + x$var3[p[2,]]) 
})) 
#  order obs1 obs2 year var1 var2 var3 
# 1.1 3_33 1 3 1 42 802 NA 
# 1.2 3_78 1 6 1 37 650 NA 
# 1.3 3_93 1 7 1 NA NA NA 
# 1.4 33_78 3 6 1 15 276 NA 
# 1.5 33_93 3 7 1 NA NA NA 
# 1.6 78_93 6 7 1 NA NA NA 
# 2.1 4_34 1 3 2 43 926 3730 
# 2.2 4_79 1 6 2 38 764 2681 
# 2.3 4_94 1 7 2 37 775 2632 
# 2.4 34_79 3 6 2 15 312 1641 
# 2.5 34_94 3 7 2 14 323 1592 
# 2.6 79_94 6 7 2 9 161 543 
# 3.1 5_35 1 3 3 NA 920 3762 
# 3.2 5_80 1 6 3 NA 754 2869 
# 3.3 5_95 1 7 3 NA 732 2576 
# 3.4 35_80 3 6 3 15 318 1893 
# 3.5 35_95 3 7 3 13 296 1600 
# 3.6 80_95 6 7 3 8 130 707 

這使您能夠在您如何結合觀測數據對非常靈活一年內--- x[p[1,],]代表每對中第一個元素的年份特定數據,而x[p[2,],]代表每對中第二個元素的年份特定數據。您可以使用任意組合的數據返回特定年份的數據幀,並將特定年份的數據幀與do.callrbind合併成單個最終數據幀。