Как использовать lubridate для создания строк для отсутствующих данных участников (продольное исследование)?

#r #lubridate

#r #любридат

Вопрос:

Я пытаюсь использовать lubridate для создания отдельных «дат начала» для каждого участника. затем я хочу, чтобы lubridate автоматически генерировал интервалы в 1 неделю, соответствующие номеру недели col.

Что я пытаюсь сделать:

в то время как (номер недели = 1) установите для данных $time значение 1, в то время как (номер недели = 2) установите для данных $time значение 2… в то время как (номер недели = 25) установите значение date $time равным 25

создайте интервал в 7 дней с момента 1, чтобы у каждого участника было 25 строк (по 1 на каждую неделю). Например, если участник пропустил 3-ю неделю, у него все равно останется строка 3-й недели, но значения будут пустыми.

 while (mydata$Weeknum == "Week1") {
       mydata$time1 <- mydata$RecorededDate

}

int <- int.start(mydata$start_time, 7days) 


 

В этом коде цикл while не работает, и после этого я застрял в вопросе, что делать, чтобы сопоставить интервал с номером недели. Заранее спасибо за помощь.

 
structure(list(Weeknum = c("Week1", "Week1", "Week1", "Week1", 
"Week1", "Week1"), V1 = structure(c(NA, 1544891009, NA, NA, NA, 
NA), class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, 
-6L), .internal.selfref = <pointer: 0x10380f2e0>, class = c("data.table", 
"data.frame"))
 

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

1. Можете ли вы показать нам, как выглядят ваши данные, предоставив нам первые несколько строк ваших данных?

2. То dput , чем вы поделились, является неполным, поэтому вы не можете его использовать. Если столбцов много, вы можете подмножествовать только те столбцы, которые важны для этого вопроса. dput(droplevels(df[1:6, 1:4]))

3. Я обновил его, чтобы показать, что я получил, когда использовал код: dput(head(droplevels(mydataframe[(RecipientLastName), (RecordedDate.y), (Weeknum)]))). (когда я не использовал head, копировать было слишком долго) recipientlastname — это идентификатор участника

Ответ №1:

Вам не нужны циклы или lubridate:

 seq(as.Date("2020-01-01"), by = "week", length = 10)
#>  [1] "2020-01-01" "2020-01-08" "2020-01-15" "2020-01-22" "2020-01-29"
#>  [6] "2020-02-05" "2020-02-12" "2020-02-19" "2020-02-26" "2020-03-04"
 

Если у вас есть несколько разных дат начала и вы хотите создать один длинный вектор с 25 неделями от каждой даты начала, вы можете сделать:

 # Example start dates
start_dates <- as.Date(c("2020-01-01", "2020-03-04", "2019-03-02"))

do.call(c, lapply(start_dates, seq, by = "week", length.out = 25))
#>  [1] "2020-01-01" "2020-01-08" "2020-01-15" "2020-01-22" "2020-01-29"
#>  [6] "2020-02-05" "2020-02-12" "2020-02-19" "2020-02-26" "2020-03-04"
#> [11] "2020-03-11" "2020-03-18" "2020-03-25" "2020-04-01" "2020-04-08"
#> [16] "2020-04-15" "2020-04-22" "2020-04-29" "2020-05-06" "2020-05-13"
#> [21] "2020-05-20" "2020-05-27" "2020-06-03" "2020-06-10" "2020-06-17"
#> [26] "2020-03-04" "2020-03-11" "2020-03-18" "2020-03-25" "2020-04-01"
#> [31] "2020-04-08" "2020-04-15" "2020-04-22" "2020-04-29" "2020-05-06"
#> [36] "2020-05-13" "2020-05-20" "2020-05-27" "2020-06-03" "2020-06-10"
#> [41] "2020-06-17" "2020-06-24" "2020-07-01" "2020-07-08" "2020-07-15"
#> [46] "2020-07-22" "2020-07-29" "2020-08-05" "2020-08-12" "2020-08-19"
#> [51] "2019-03-02" "2019-03-09" "2019-03-16" "2019-03-23" "2019-03-30"
#> [56] "2019-04-06" "2019-04-13" "2019-04-20" "2019-04-27" "2019-05-04"
#> [61] "2019-05-11" "2019-05-18" "2019-05-25" "2019-06-01" "2019-06-08"
#> [66] "2019-06-15" "2019-06-22" "2019-06-29" "2019-07-06" "2019-07-13"
#> [71] "2019-07-20" "2019-07-27" "2019-08-03" "2019-08-10" "2019-08-17"
 

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

1. проблема в том, что у каждого участника разная дата начала, будет ли это работать?

Ответ №2:

Вы можете сгруппировать по каждому participant и использовать разницу RecorededDate с первым RecorededDate для подсчета количества недель.

 library(dplyr)

result <- mydata %>%
            group_by(participant) %>%
            mutate(time1 = ceiling(as.numeric(difftime(RecorededDate, 
                                    na.omit(RecorededDate)[1], units = 'week'))))
result
 

RecorededDate столбец должен содержать дату занятия.

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

1. Когда я пытаюсь это сделать, я получаю сообщение об ошибке «Ошибка: проблема с mutate() вводом time1 . x Вход time1 не может быть переработан до размера 1. ℹ Вход time1 есть ceiling(...) . ℹ Входные time1 данные должны иметь размер 1, а не 2003. ℹ Ошибка произошла в группе 1: mydataframe$RecipientLastName = 1.»

2. Что такое class(mydata$RecorededDate) ? 2) Попробуйте с dplyr::mutate помощью . 3) Предоставьте образец использования ваших данных dput(head(mydata)) .

3. класс [1] «POSIXct» «POSIXt» , я получаю ту же ошибку, когда использую dplyr::mutate , однако даже когда я сделал as.date(RecordedDate) Я получил ту же ошибку

4. Недостаточно данных для проверки этого, но у вас есть много NA значений. difftime Вместо first(RecorededDate) можете ли вы заменить его na.omit(RecorededDate)[1] и попробовать. Я также обновил ответ, показывающий это.