R函数将数据分组并按时间间隔汇总到另一列中

R函数将数据分组并按时间间隔汇总到另一列中,r,group-by,dplyr,R,Group By,Dplyr,我有以下格式的数据: 第一列是个人的ID,其BMI在列日期的不同时间测量。我想取一年期间的平均体重指数,即诊断日期前6个月和诊断日期后6个月。请注意,诊断日期与诊断日期相同 预期输出类似于: ID Date BMI Date_of_diagnosis Avg BMI 718 07-01-1994 28.75 13-12-1999 25.8 718 07-01-1994 28.75 13-12-1999 718 07-01-1994

我有以下格式的数据:

第一列是个人的ID,其BMI在列日期的不同时间测量。我想取一年期间的平均体重指数,即诊断日期前6个月和诊断日期后6个月。请注意,诊断日期与诊断日期相同

预期输出类似于:

ID   Date         BMI    Date_of_diagnosis Avg BMI
718  07-01-1994   28.75  13-12-1999        25.8
718  07-01-1994   28.75  13-12-1999
718  07-01-1994   28.75   13-12-1999

这里有一个使用dplyr的方法

请注意,R中有很多函数可以提供月中两个日期之间的月,但是它们大多假设为30天-月,这就是为什么我更喜欢构建自定义函数,但您可以自由使用任何函数

在这里,我还使间隔less/more按照指定值彼此相等,但是您可以通过设置另一个变量来改变这一点

library(dplyr)

# Sample of the input data
data <-
  data.frame(
    ID = c(718, 718, 718),
    Date = lubridate::dmy(c("07-01-1994", "07-01-1994", "07-01-1994")),
    BMI = c(28.75, 28.75, 28.75),
    Date_of_diagnosis = lubridate::dmy(c("13-12-1999", "13-12-1999", "13-12-1999"))
  )

# Function to calculate months between 2 dates in months
months_between <- function(end_date, start_date) {
  ed <- as.POSIXlt(end_date)
  sd <- as.POSIXlt(start_date)
  12 * (ed$year - sd$year) + (ed$mon - sd$mon)
}

# Setting the interval i.e. 72 months before/after diagnosis
num_months <- 72

data %>%
  # If the difference between diagnosis and date is less/more than Date by num_month
  # then consider the BMI
  mutate(avg_bmi = 
           ifelse(between(months_between(Date_of_diagnosis, Date), 0, num_months) |
                    between(months_between(Date_of_diagnosis, Date), -1 * num_months, 0), 
                  BMI, NA)) %>%
  group_by(ID) %>% # To calculate for each ID
  mutate(avg_bmi = mean(avg_bmi, na.rm = TRUE)) # Calculating average BMI for interval

# # A tibble: 3 x 5
# # Groups:   ID [1]
# ID Date         BMI Date_of_diagnosis avg_bmi
# <dbl> <date>     <dbl> <date>              <dbl>
# 718 1994-01-07  28.8 1999-12-13           28.8
# 718 1994-01-07  28.8 1999-12-13           28.8
# 718 1994-01-07  28.8 1999-12-13           28.8
库(dplyr)
#输入数据的样本

数据请使用
dput
添加数据,而不是图像。此外,还显示相同的预期输出。请阅读有关的信息和如何给一个。我不知道如何使用dput。我已经添加了预期输出。如果间隔是您提到的前/后6个月,那么给定的示例并不代表正确的输出,因为它是1999年和1994年。如果您的数据帧在控制台中被称为
df
run
dput(df)
,复制输出并粘贴到此处,或者以与共享预期输出相同的方式共享数据,以便轻松复制粘贴而不是图像。