Биннинг датируется десятилетиями, по столбцам, в матрице - PullRequest
0 голосов
/ 09 марта 2012

У меня есть смоделированная матрица дат, которую я сгенерировал из функции вероятности. Каждый столбец представляет одну итерацию.

Я бы хотел каждый бин отдельно по десятилетиям и сваливать их в новую матрицу, где каждый столбец - это длина всех десятилетий одного цикла с числом дат, сгруппированных по десятилетия.

Я успешно сделал это для одного вектора дат, но не для матрицы:

«даты» - это вектор наблюдаемых данных, представляющих, когда в популяции образовались определенные деревья

#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 голосов
/ 09 марта 2012

Я уже ответил на это на 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)                   } )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...