R: добавьте новые строки в фрейм данных при выполнении условия, а затем повторите конечное значение

#r

#r

Вопрос:

У меня есть фрейм данных с повторными измерениями для отдельных пользователей

 ID    Day    Value
1      1     1
1      3     NA
1      4     3
1      5     5
 

После того, как объекты достигают определенного значения (5 или 0,5), они исчезают из набора данных. Тем не менее, я хочу добавить строки для этих пациентов и повторять последнее значение до 60-го дня

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

 ID    Day    Value
1      1     1
1      3     NA
1      4     3
1      5     5
1      6     5
1      7     5
1      ...   5
1      60    5
 

Существует много объектов, и с каждым из них должно произойти то же самое, поэтому
, когда значение = 5, повторяйте 5 до 60-го дня
, когда значение = 0,5, повторяйте 0,5 до 60-го дня

Некоторые субъекты достигают 5 или 0,5 через 1 день, другие — через 59 дней, и все, что между ними. Также есть много пропущенных значений, и если они есть до того, как объект достигнет 5 или 0,5, они должны оставаться NA.

Я понятия не имею, как это сделать, я искал в Интернете, но не смог найти этот вопрос, извиняюсь, если это дубликат.

Если что-то неясно, пожалуйста, дайте мне знать, спасибо!

Комментарии:

1. Добро пожаловать в SO. Не беспокойтесь так сильно о дубликатах — дубликаты хороши ! Они создают большой набор разных вопросов для одной и той же проблемы — увеличивая видимость. Больше беспокойтесь о воспроизводимости — см. В @G. Ответ Гротендика на один из способов создания хорошего воспроизводимого примера.

Ответ №1:

Используя воспроизводимые данные в примечании в конце, где nday представляет номер дня, до которого мы хотим — мы используем 7 здесь, но вы можете изменить его на 60. Создайте функцию, которая выполняет вычисление для одного идентификатора. Затем примените его к каждому идентификатору и повторно свяжите результаты вместе. Обратите внимание, что если mx уже равно nday , то, поскольку в нем нет else элемента if , значение more будет равно NULL, а rbind значение NULL просто возвращает данные по желанию. Пакеты не используются.

 add_data <- function(data) {
  mx = max(data$Day)
  more <- if (mx < nday) {
    with(data, data.frame(ID = ID[1], Day = seq(mx 1, nday), Value = tail(Value, 1)))
  }
  rbind(data, more)
}
do.call("rbind", by(DF, DF$ID, add_data))
 

предоставление:

     ID Day Value
1.1  1   1     1
1.2  1   3    NA
1.3  1   4     3
1.4  1   5     5
1.5  1   6     5
1.6  1   7     5
2.5  2   1     1
2.6  2   3    NA
2.7  2   4     3
2.8  2   5     5
2.1  2   6     5
2.2  2   7     5
 

Примечание

 DF <- data.frame(ID = rep(1:2, c(4, 4)), Day = c(1, 3, 4, 5), Value = c(1, NA, 3, 5))
nday <- 7 # number of days up to which we need; replace with 60
 

Комментарии:

1. Мне интересно, может ли эта проблема иметь место while ?

2. Кроме того, мне действительно интересно узнать ваши мысли — как вы думаете, предлагаемый вами код может увеличивать объект?

3. @tjebo, нет на оба вопроса.