Создать серию пронумерованных столбцов в кадре данных, которые содержат функцию предыдущей переменной - PullRequest
1 голос
/ 12 марта 2020

Полный новичок в R, переходящий от SAS и очень много борющийся с некоторыми основными c техниками, включая знание, где искать ответы. Я надеюсь, что вы можете помочь мне здесь.

Моя общая цель - попытаться спрогнозировать выживание популяции с течением времени, когда существует индивидуальная спецификация c, но не зависящая от времени вероятность неудачи в каждый момент времени , На данный момент я успешно создал фрейм данных, состоящий, скажем, из 5 строк и двух переменных p и S0, которые указывают на вероятность отказа в каждый момент времени и выживание в момент времени 0, которое установлено равным 1 для всех строк. Как показано ниже

enter image description here

Чтобы эффективно и эффективно сделать sh, необходимо расширить фрейм данных до 5 периодов, рассчитывая индивидуальную вероятность выживание, применяя следующую формулу S (i) = S (i-1) - p * S (i-1), так что я получаю следующий кадр данных со многозначно названными столбцами / переменными ...

enter image description here

Мне очень хочется попробовать сделать это через al oop, но я подозреваю, что это будет очень неэффективным способом сделать это.

1 Ответ

0 голосов
/ 12 марта 2020

Да, все oop подойдет. Вот пример, созданный для более общего использования:

X <- data.frame(P = c(0.01, 0.3, 0.02, 0.015, 0.2), S0 = 1)

update <- function(x, p) x * (1-p)
fname <- "S0"
basename <- "S"

for (i in 1:5) {
  newname <- paste0(basename, i)
  X[[newname]] <- update(X[[fname]], X$P)
  fname <- newname
}

Для проверки эффективности , я рассчитал это l oop для фрейма данных с 100 000 000 записей, созданных случайным образом через

X <- data.frame(P = rbeta(1e8, 2, 2), S0 = 1)

. Это заняло 1,58 секунды пользовательского времени и 1,78 секунды прошедшего времени. Если у вас нет гораздо большего фрейма данных или вам нужно сгенерировать гораздо больше столбцов, это выглядит достаточно эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...