Внутри al oop как сделать условную выборку? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть следующий код:

# Initial values of time and intercept
t0 <- 0
y0 <- 0

# The list to sample the slopes
cd <- list("a" = seq(0,1,.2), "b" = seq(1,2,.2))

# Function to sample slope given the list/df and number (from column cd)
sampler <- function(df, number){
  res <- sample(df[[number]],1,replace = T)
  return(res)
}

for (i in 1:length(df$t)){
  if(df$Status[i] == "B"){
    t0 <- df$t[i]
    y0 <- df$y[i-1] - 0.05 # When status == B there will be a drop on the next intercept
    df$y[i] <- y0
  } else {
    slope <- sampler(cd,df$cd[i])
    df$y[i] <- y0 + slope*(df$t[i]-t0)
    print(slope)
  }
}

Здесь я пытаюсь заменить столбец y линейной функцией при заданном начальном значении перехвата y0 и наклоне, случайно выбранном из списка, условно по значению столбец cd.

Здесь моя проблема заключается в том, что каждый раз для каждой точки выбирается разный наклон. Но для последовательной серии состояний A (пока она не станет B) я хочу сохранить тот же уклон. Например, если при t = 1 выборочный уклон имеет значение x, я бы хотел сохранить наклон x до t = 4, а затем при t = 6 будет новая выборка, которая останется такой же до t = 9. Таким образом, в основном, из t = 1-4 это будет прямая линия, а затем после падения снова будет прямая из t = 6-9. Любая помощь могла бы быть полезна.

Вот воспроизводимый пример -

t <- c(1:10)
df <- as.data.frame(t)
df$y <- 0
df$Status <- "A"
df$Status[seq(5, length(df$t), 5)] <- "B"
df$cd[1:5] <- 1
df$cd[6:10] <- 2

Выход выглядит так:

> df
    t y Status cd
1   1 0      A  1
2   2 0      A  1
3   3 0      A  1
4   4 0      A  1
5   5 0      B  1
6   6 0      A  2
7   7 0      A  2
8   8 0      A  2
9   9 0      A  2
10 10 0      B  2
...