【问题标题】:How to use lubridate to create rows for missing participant data (longitudinal study)?如何使用 lubridate 为缺失的参与者数据创建行(纵向研究)?
【发布时间】:2020-12-04 22:17:29
【问题描述】:

我正在尝试使用 lubridate 为每个参与者创建单独的“开始日期”。然后我希望 lubridate 自动生成与“周数”列相对应的 1 周间隔。

我正在尝试做的事情:

while (week number = 1) set data$time 为 1 while (week number = 2) 将 data$time 设置为 2 ... while (week number = 25) 将 date$time 设置为 25

从时间 1 开始创建 7 天的间隔,以便每个参与者有 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"))

【问题讨论】:

  • 您能否通过向我们提供数据的前几行来向我们展示您的数据的外观?
  • 您分享的dput不完整,无法使用。如果有很多列,您可以只对对这个问题很重要的列进行子集化。 dput(droplevels(df[1:6, 1:4]))
  • 我更新了它以显示我在使用代码时得到的结果:dput(head(droplevels(mydataframe[(RecipientLastName), (RecordedDate.y), (Weeknum)])))。 (当我不使用 head 时复制时间太长)接收者姓氏是参与者 ID

标签: r lubridate


【解决方案1】:

您不需要循环或润滑:

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"

【讨论】:

  • 问题是每个参与者都有不同的开始日期,这仍然有效吗?
【解决方案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 列应属于 Date 类。

【讨论】:

  • 当我尝试这个时,我收到错误“错误:mutate() 输入有问题time1。x 输入time1 无法回收到大小1。ℹ输入time1 是@ 987654330@。ℹ输入time1必须是大小1,而不是2003。ℹ第1组出现错误:mydataframe$RecipientLastName = 1。"
  • 什么是class(mydata$RecorededDate)? 2) 试试dplyr::mutate。 3) 使用dput(head(mydata))提供您的数据样本。
  • 类是 [1] "POSIXct" "POSIXt" ,当我使用 dplyr::mutate 时,我得到了同样的错误,但是即使我做了 as.date(RecordedDate) 我也得到了同样的错误
  • 没有足够的数据来测试这个,但你有很多 NA 值。在 difftime 而不是 first(RecorededDate) 中,您可以将其替换为 na.omit(RecorededDate)[1] 并尝试。我还更新了答案。
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2020-06-23
相关资源
最近更新 更多