2015-02-06 88 views
3

假設我有以下列表:創建一個衡量的R中增長率的差別矩陣列表

$`1990` 
    cntry year growth 
1  1 1990  1 
2  2 1990  2 
3  3 1990  14 

$`1991` 
    cntry year growth 
4  1 1991  6 
5  2 1991  5 
6  3 1991  7 

代碼來創建列表:

cntry<-c(1,2,3,1,2,3) 
year<-c(1990,1990,1990,1991,1991,1991) 
growth<-c(1,2,14,6,5,7) 

a<-data.frame(cntry,year,growth) 
a.split<-split(a, as.factor(a$year)) 

我想製作的是衡量兩國增長率差異的矩陣清單。

  1. 在各個矩陣,在生長速率的差異只應如果該國的在列 生長速率比該行中的國家的一個更高的計算。
  2. 如果在列的生長速率等於或小於該行中的國家的一個 越小,則矩陣應該如果存在至少一個國家與所述組合顯示的0
  3. 的值NA值, 那麼矩陣應該在各自的字段中顯示0。

結果應該如下:

$`1990` 
    1 2 3 
1 0 1 13 
2 0 0 12 
3 0 0 0 

$`1991` 
    1 2 3 
1 0 0 1 
2 1 0 2 
3 0 0 0 

任何幫助是非常歡迎!

回答

3

使用outer

> lapply(a.split, function(x) t(outer(x$growth, x$growth, function(u,v) ifelse(u>v, u-v, 0)))) 
#$`1990` 
#  [,1] [,2] [,3] 
#[1,] 0 1 13 
#[2,] 0 0 12 
#[3,] 0 0 0 

#$`1991` 
#  [,1] [,2] [,3] 
#[1,] 0 0 1 
#[2,] 1 0 2 
#[3,] 0 0 0 
+0

作品完美一如既往,感謝@colonel beauvel!最後一個問題:你如何確保,如果組合中有NA值,則粘貼0? – jsts 2015-02-06 14:30:32

+0

我覺得不能正確理解,你的意思是在a.split中的某個data.frame的增長列中出現NA?在這種情況下,你可以這樣做'lst = lapply(a.split,function(u){u [is.na(u)] = 0; u})'然後應用外部的一行腳本。 – 2015-02-06 14:33:43

+0

這就是我一直在尋找的,謝謝! – jsts 2015-02-06 16:38:15