1

ここに私が取り組んでいるコードがあります。

  rnumbers <- data.frame(replicate(5,runif(20000, 0, 1)))
dt <- c(.001)
A <- dt*1
B <- dt*.5

## A = 0
## B = 1 

rstate <- rnumbers  # copy the structure
rstate[] <- NA      # preserve structure with NA's
# Init:
rstate[1, ] <- rnumbers[1, ] <  .02 & rnumbers[1, ] > 0.01

step_generator <- function(col, rnum){
    for (i in 2:length(col) ){
            if( rnum[i] < B) { col[i] <- 0  }
                       else { if (rnum[i] < A) {col[i] <- 1 }
                              else {col[i] <- col[i-1] } }
                        }
    return(col)
    }
#  Run for each column index:
for(cl in 1:5){ rstate[ , cl] <- 
                        step_generator(rstate[,cl], rnumbers[,cl]) }



rstate1 <- transform(rstate, time = rep(dt))
rstate2 <- transform(rstate1, cumtime = cumsum(time))

これにより、時間の経過とともに状態が切り替わる 5 つの列を持つデータ フレームが得られます。時間間隔は 6 列目 (秒) で、累積時間は 7 列目 (秒) です。ここで、各状態がどのくらい続くかを秒単位で確認したいと思います。これは私がやっていることです -

1)lengths <- rle(rstate2[,1])

>Run Length Encoding
  lengths: int [1:15] 366 3278 1817 451 3033 1655 1901 748 742 1780 ...
  values : num [1:15] 0 1 0 1 0 1 0 1 0 1 ...

2)lengths1 <- data.frame(state = lengths$values, duration = lengths$lengths)

> lengths1
       state duration
    1      0      366
    2      1     3278
    3      0     1817
    4      1      451
    5      0     3033
    6      1     1655
    7      0     1901
    8      1      748
    9      0      742
    10     1     1780
    11     0       26
    12     1      458
    13     0      305
    14     1     1039
    15     0     2401

3)library("plyr")

lengths2 <- transform(lengths1, time = duration*dt)
lengths3 <- arrange(lengths2, desc(state))

> lengths3
   state duration  time
1      1     3278 3.278
2      1      451 0.451
3      1     1655 1.655
4      1      748 0.748
5      1     1780 1.780
6      1      458 0.458
7      1     1039 1.039
8      0      366 0.366
9      0     1817 1.817
10     0     3033 3.033
11     0     1901 1.901
12     0      742 0.742
13     0       26 0.026
14     0      305 0.305
15     0     2401 2.401

4)col1 <- ddply(lengths3, .(state), function(df) 1/mean(df$time))

> col1
  state        V1
1     0 0.7553583
2     1 0.7439685

したがって、col1 は の column1 の「1/mean(各状態の時間)」を表示していrstate2ます。私がやりたいことは、すべての列に対して手順 1 ~ 4 を繰り返しrstate2、次のようなデータ フレームを生成することです。

> rates
  state col1 col2 col3 col4 col5
1     0  0.1  0.2  0.3  0.4  0.5
2     1  0.3  0.4  0.5  0.6  0.7

各列の数値は1/mean(df$time)、rstate2 の各列の数値と同じです。

助けてくれてありがとう。

4

1 に答える 1