2015-09-08 88 views
2

當我嘗試使用下面編寫的for循環填充矩陣時,我不斷收到'下標越界'錯誤。我的數據是類似於下面的虛擬數據集的大型CSV文件:如何從一個for循環中填充矩陣R

 Sample k3 Year 
1 B92028UUU 1 1990 
2 B93001UUU 1 1993 
3 B93005UUU 1 1993 
4 B93006UUU 1 1993 
5 B93010UUU 1 1993 
6 B93011UUU 1 1994 
7 B93022UUU 1 1994 
8 B93035UUU 1 2014 
9 B93036UUU 1 2014 
10 B95015UUU 2 2013 
11 B95016UUU 2 2013 
12 B98027UUU 2 1990 
13 B05005FUS 2 1990 
14 B06006FIS 2 2001 
15 B06010MUS 2 2001 
16 B05023FUN 2 2001 
17 B05024FUN 3 2001 
18 B05025FIN 3 2001 
19 B05034MMN 3 2002 
20 B05037MMS 3 1996 
21 B05041MUN 3 1996 
22 B06047FUS 3 2007 
23 B05048MUS 3 2000 
24 B06059FUS 3 2000 
25 B05063MUN 3 2000 

我的腳本如下:

Year.Matrix = matrix(1:75,nrow=25,byrow=T) 
colnames(Year.Matrix)=c("Group 1","Group 2","Group 3") 
rownames(Year.Matrix)=1990:2014 

for(i in 1:3){ 
    x=subset(data2,k3==i) 
for(j in 1990:2014){ 
    y=subset(x,Year==j) 
    z=nrow(y) 
    Year.Matrix[j,i]=z 
    } 
} 

不知道爲什麼我收到錯誤消息,但來自其他職位我當我嘗試填充我的矩陣時,發現問題出現了,也許是因爲我每個k3級別都沒有每年的條目?

任何評論將有幫助!

+0

在'Year.Matrix [J,I]'j是索引和應爲1至25之間的整數不一九九○年至2014年 – HubertL

回答

2

這裏不需要使用循環。你只是通過yeark3列計算長度:

library(data.table) 
setDT(dat)[,.N,"Year,k3"] 
    Year k3 N 
1: 1990 1 1 
2: 1993 1 4 
3: 1994 1 2 
4: 2014 1 2 
5: 2013 2 2 
6: 1990 2 2 
7: 2001 2 3 
8: 2001 3 2 
9: 2002 3 1 
10: 1996 3 2 
11: 2007 3 1 
12: 2000 3 3 
1

您還可以使用dplyr做到這一點。 A dplyr解決方案如下:

dat %>% 
    group_by(Year, k3) %>% 
    summarize(N=n()) 
0

不確定您要做什麼,但正如Hubert L所說。你j指數的值應該是一個整數,而填充Year.Matrix應該像值自1..2..3..你做(j in 1990:2014)它會給j1990..1991..1992.....2014 解決這個問題,如下抵消你row指數。您的for循環

for(i in 1:3){ 
    print(i) 
    x=subset(data2,k3==i) 
    for(j in seq_along(1990:2014)){ 
     print(j) 
     y=subset(x,Year==j) 
     z=nrow(y) 
     Year.Matrix[j,i]=z 
    } 
} 

繼續使用print語句來調試您的函數。運行此循環會立即告訴您數據,您將索引Year.Matrix[1990,1],這將通過無約束的異常。

修復此for循環通過偏移索引爲:

for(i in 1:3){ 
    print(i) 
    x=subset(data2,k3==i) 
    for(j in 1990:2014){ 
     print(j) 
     y=subset(x,Year==j) 
     z=nrow(y) 
     Year.Matrix[1990-j+1,i]=z 
    } 
} 
+0

感謝大家的快速,有益的迴應,我將與您的建議合併! – NRM