【问题标题】:date (time) conversion in a long shape dataframe长形数据框中的日期(时间)转换
【发布时间】:2019-01-29 13:18:45
【问题描述】:

这是我的数据框的屏幕截图。数据框很长(每行包含每个患者 ID 的多个测量值)。每个 Patient_id 的重复测量次数(行)不同。在 R 软件中,我想生成一个新的日期变量作为每个日期(按顺序)减去第一个日期并将其保存为天。

【问题讨论】:

  • 你能输入你的数据吗?
  • 编辑您的问题以添加dput(head(df,10))的输出

标签: r dplyr plyr


【解决方案1】:

使用 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

【讨论】:

  • 如何只选择间隔为 2 ±1 天的第一次测量?
  • 添加另一个管道过滤结果,如%&gt;% filter(days_since_first_time %in% 1:3)
  • 谢谢约翰。您的过滤器管道为每个患者 ID 提供多个测量值。到现在为止还挺好。如何仅选择一个更接近值的唯一度量(例如您的示例中的 1)。
  • 添加另一个过滤器,其中%&gt;% filter(days _since_first_time == min(days_since_first_time)
  • 您应该考虑阅读有关dplyr 包的信息。它在这种数据操作中很有用。
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 2022-01-19
  • 1970-01-01
  • 2020-07-01
  • 2018-09-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多