#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, нет на оба вопроса.