【发布时间】:2019-01-29 13:18:45
【问题描述】:
这是我的数据框的屏幕截图。数据框很长(每行包含每个患者 ID 的多个测量值)。每个 Patient_id 的重复测量次数(行)不同。在 R 软件中,我想生成一个新的日期变量作为每个日期(按顺序)减去第一个日期并将其保存为天。
【问题讨论】:
-
你能输入你的数据吗?
-
编辑您的问题以添加
dput(head(df,10))的输出
这是我的数据框的屏幕截图。数据框很长(每行包含每个患者 ID 的多个测量值)。每个 Patient_id 的重复测量次数(行)不同。在 R 软件中,我想生成一个新的日期变量作为每个日期(按顺序)减去第一个日期并将其保存为天。
【问题讨论】:
dput(head(df,10))的输出
使用 dplyr 您应该按 id 分组,然后变异以添加新列,如下所示。
library(tidyverse)
# example data frame (always dput a simple piece of your data)
df <- structure(list(patient_id = c(1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L,
2L, 2L), date = structure(c(17600, 17601, 17602, 17603, 17604,
17605, 17606, 17607, 17608, 17609), class = "Date")), class = "data.frame",
row.names = c(NA, -10L))
关键是将您的日期变量作为日期对象存储在数据框中,这样您就可以使用它进行算术运算。要转换日期变量,您可以使用 lubridate 包中的 as_date 函数。
df %>%
group_by(patient_id) %>% # group by patient
mutate(days_since_first_time = date - min(date)) %>%
arrange(patient_id, date)
# this is the output
patient_id date days_since_first_time
1 2018-03-10 0
1 2018-03-14 4
1 2018-03-18 8
2 2018-03-11 0
2 2018-03-12 1
2 2018-03-13 2
2 2018-03-15 4
2 2018-03-16 5
2 2018-03-17 6
2 2018-03-19 8
【讨论】:
%>% filter(days_since_first_time %in% 1:3)
%>% filter(days _since_first_time == min(days_since_first_time)
dplyr 包的信息。它在这种数据操作中很有用。