R函数将数据分组并按时间间隔汇总到另一列中
我有以下格式的数据: 第一列是个人的ID,其BMI在列日期的不同时间测量。我想取一年期间的平均体重指数,即诊断日期前6个月和诊断日期后6个月。请注意,诊断日期与诊断日期相同 预期输出类似于: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 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
rundput(df)
,复制输出并粘贴到此处,或者以与共享预期输出相同的方式共享数据,以便轻松复制粘贴而不是图像。