Вычислить строку на основе предыдущей строки в цикле без пакетов - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь создать цикл (без использования пакетов) для вычисления строк массива.Каждая строка матрицы рассчитывается с одним из значений предыдущей строки (в коде переменная B из второй строки представляет собой значение переменной C предыдущей строки).Моя попытка написана ниже:

df=data.frame(matrix(ncol = 4, nrow = 5))
names(df)=c("A", "B", "C", "D")

for (i in 1:nrow(df){
  df$A<-c(0, 0.25, 0.50, 0.75, 1.00)
  df$B<-ifelse(df$A==0, 0, C[i-1])
  df$C<-df$A*df$B)+1
  df$D<-df$C+5
}
df

Ожидаемый результат:

     A    B    C    D
1 0.00 0.00 1.00 6.00
2 0.25 1.00 1.25 6.25
3 0.50 1.25 1.63 6.63
4 0.75 1.63 2.22 7.22
5 1.00 2.22 3.22 8.22

Что я делаю не так?

1 Ответ

2 голосов
/ 09 июля 2019

Внутри цикла вы должны поместить столбцы в строку, над которой вы работаете (строка i) для данной итерации цикла.В противном случае вы выполняете присваивание для всего столбца каждый раз, а не только для одной строки.Кроме того, создание A и D не обязательно должно быть в цикле.

df$A <- c(0, 0.25, 0.50, 0.75, 1.00)
for(i in 1:nrow(df)){
  df$B[i] <- ifelse(df$A[i] == 0, 0, df$C[i-1])
  df$C[i] <- df$A[i]*df$B[i] + 1
}
df$D <- df$C + 5

Вы также можете сделать это, используя Reduce, но нет единого мнения о том, что это лучше, и многиелюди скажут, что использование Reduce с accumulate = T хуже, чем просто использование цикла

df$A <- c(0, 0.25, 0.50, 0.75, 1.00)
df[, c('B', 'C')] <- 
  do.call(rbind, 
          Reduce(function(x, A) (A != 0)*x[2]*c(1, A) + 0:1, 
                 df$A, init = c(0, 0), accumulate = T))[-1,]
df$D <- df$C + 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...