-1

我正在尝试编写一个程序,将状态从 A 设置为状态 B,反之亦然。

rnumbers <- data.frame(replicate(5,runif(2000, 0, 1)))

我正在想象这个均匀分布的随机数数据框,除了它有 10000 行而不是 20 行。

设置进入状态 A 和状态 B 的概率:

dt <- c(.02)
A <- dt*1
B <- dt*.5

创建一个遍历数据帧 rnumbers 的函数,如果数字小于 B,则输入 0,如果数字小于 A,则输入 1。

step_generator <- function(x){
    step <- ifelse ( x <  B, 0, ifelse(x < A, 1, NA))
    return(step)
    }
state <- apply(rnumbers, 2, step_generator)

这基本上给了我我想要的 - 一个数据框,其列包含 0、1 或 NA,具体取决于 rnumbers 中随机数的值。但是,我错过了几件事-

1)我想跟踪每个状态持续多长时间。我的意思是,如果你把每一行想象成上面的时间变化(dt <- c(.02))。我希望能够绘制“状态与时间”。为了解决这个问题,这是我尝试过的:

state1 <- transform(state, time = rep(dt))
state2 <- transform(state1, cumtime = cumsum(time))

这让我接近我想要的,cumtime 从 0.02 到 0.4。但是,我希望时钟从第一行的 0 开始,并将 .02 添加到每个后续行。

2)我需要知道每个状态持续多长时间。本质上,我希望能够浏览每一列,并询问每个状态持续多长时间(cumsum)。然后,这将为我提供状态 A 和状态 B 的时间分布。我希望将其存储在另一个数据框中。

我认为这是有道理的,如果有任何不清楚的地方,请告诉我,我会澄清。

感谢您的任何帮助!

4

1 回答 1

1

“数字小于 .02*1 和大于 .02*.5”之间的范围非常窄,因此如果您设置此模拟,第一行的大部分内容很可能为零。ifelse当条件具有任何回溯功能时,您不能真正希望获得成功。该功能不允许“反向索引”。

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]) }
于 2013-11-11T18:20:51.213 回答