分组以矩阵形式显示数十年

时间:2012-03-09 16:01:45

标签: r

我有一个模拟的日期矩阵,我是从概率函数生成的。每列代表一次迭代。

我想将每次运行分开几十年并将它们转储到一个新的矩阵中,其中每列是所有几十年的长度,单个运行的数字日期按十年分组。

我已经成功地为一个日期向量做了这个,但没有为矩阵做过:

“日期”是观察数据的向量,表示何时在群体中建立某些树

#find min and max decade
minDecade <- min(dates) 
maxDecade <- max(dates) 

#create vector of decades 
allDecades <- seq(minDecade, 2001, by=10) 

#make empty vector of same length as decade vector
bin.vec <- rep(0,length(allDecades)) 

#populate bin.vec (empty vector) with the number of trees in each decade
for (i in 1:length(allDecades)) {                     
     bin.vec[i] <- length(which(dates==allDecades[i])) 
} 

bin.vec:

  

0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 2 0 1 3 0 1 3 8 5 9 8 5 5 4 10 3 6 9 17 32 37 35 25 31 41 41 44 45 40 50 43 59 42 46 28 16 18 20 16 11 4 7 1

这基本上是我需要做的,只针对矩阵中的每个单独的列。

我的矩阵看起来像这样(它实际上有835行,但我用head()来缩短它):

     1   2    3    4    5 
1  1891 1791 1771 1741 1981    
2  1881 1851 1941 1831 1841    
3  1981 1861 1761 1781 1791    
4  1911 1901 1941 1801 1801    
5  1771 1751 1841 1751 1951    
6  1821 1871 1821 1691 1851    
7  1851 1851 1931 1921 1931    
8  1921 1941 1601 1751 1861    
9  1741 1761 1931 1791 1891    
10 1751 1891 1951 1931 1901

每列都是我模拟的独立迭代(runs <- 10)。如何将每列分成几十年?

1 个答案:

答案 0 :(得分:0)

我今天早上已经在r-help上回答了这个问题,虽然您提供的数据看起来像是您在此处提供的数据的转置:

> dates <- scan()
1:   1891 1791 1771 1741 1981    
6:  1881 1851 1941 1831 1841    
11:  1981 1861 1761 1781 1791    
16:  1911 1901 1941 1801 1801    
21:  1771 1751 1841 1751 1951    
26:  1821 1871 1821 1691 1851    
31:  1851 1851 1931 1921 1931    
36:  1921 1941 1601 1751 1861    
41:  1741 1761 1931 1791 1891    
46:  1751 1891 1951 1931 1901
51: 
Read 50 items

 dates <- matrix(dates, ncol=5, byrow=TRUE)
 apply( dates, 2, function(colm){
                     1 + max(findInterval(colm, allDecades)) -
                             min(findInterval(colm, allDecades) )
                                } )
#-----------
#[1] 25 20 36 25 20

在我的回答中,我注意到你的问题描述含糊不清。如果您希望这是一个矩阵,其行数等于'allDecades'的长度,那么请使用以下代码:

 apply( dates, 2, function(colm) { 
                alldec0 <- rep(0, length(allDecades))
                names(alldec0) <- 1:length(alldec0)
                alldec0[ as.numeric(names(table(findInterval(colm, allDecades))))] <- 
                           table(findInterval(colm, allDecades)) 
                return(alldec0)                   } )