我有一个看起来像这样的数据集。
# create data frame example
df1 <- data.frame("ckdate" = c("2016-04-28 22:30:00", "2016-05-14 12:00:00", "
2016-05-15 02:00:00", "2016-05-16 00:00:00", "2016-05-17 03:30:00"),
"lab_value" = c(12, 35, 9, 55, 90),
"pid" = c(1, 1, 2, 2, 2)
)
此处的目标是将日期时间标准化为 12 小时块,然后计算这些块内患者的平均“lab_value”。最终,我可以绘制一个图来显示每个 12 小时时间点的平均实验室值。这是我到目前为止编码的内容
normalize_dates <- function(df){
df <- df %>%
mutate(ckdate = as.POSIXct(ckdate, format = "%Y-%m-%d %H:%M:%S")) %>%
mutate(hours_since_first = as.numeric(difftime(ckdate, min(ckdate), units = "hours"))) %>%
mutate(hours_since_first = hours_since_first %/% 12)
return(df)
}
df2 <- normalize_dates(df1) # This returns NAs for all differences
有许多缺失(NA 值)。所以我想知道的第一件事是
difftime
是否可以处理 NA,如果可以,是否有 na.omit
选项?或者有不同的方法来计算这些差异吗?
然后计算我的平均值
# finally, for each 12 hour block, take the average lab_value accross pids
df1 %>%
group_by(hours_since_first) %>%
summarize(mean_lab_value = mean(lab_value))
但我还不能真正测试这个,因为我无法获得 12 小时的时间块。我在 R 方面工作很多,但在处理日期时间方面的经验很少,所以这里的任何帮助将不胜感激。
您的
df1$ckdate
文件中有一个空格,它会破坏您的所有值。
您的输入创建,请注意
\n
:
ckdate lab_value pid
1 2016-04-28 22:30:00 12 1
2 2016-05-14 12:00:00 35 1
3 \n2016-05-15 02:00:00 9 2
4 2016-05-16 00:00:00 55 2
5 2016-05-17 03:30:00 90 2
像这样清理你的数据:
df1 <- data.frame(ckdate = c("2016-04-28 22:30:00", "2016-05-14 12:00:00", "2016-05-15 02:00:00", "2016-05-16 00:00:00", "2016-05-17 03:30:00"),
lab_value = c(12, 35, 9, 55, 90),
pid = c(1, 1, 2, 2, 2)
)
该功能将起作用
norm_dates <- function(df){
df %>%
mutate(ckdate = as.POSIXct(ckdate, format = "%Y-%m-%d %H:%M:%S"),
dif = as.numeric(difftime(ckdate, min(ckdate), units = 'hours')) %/% 12)
}
norm_dates(df1)