使用dplyr按日期之间的总结分组
在使用summary时,我很难理解dplyr中的一些逻辑 我感兴趣的是为每个ID中的每个日期计算一些感兴趣的统计数据(例如,某个列的平均值),我的数据包括开始日期和结束日期列 假设我有分层数据,每行有一个使用dplyr按日期之间的总结分组,r,dplyr,tidyverse,R,Dplyr,Tidyverse,在使用summary时,我很难理解dplyr中的一些逻辑 我感兴趣的是为每个ID中的每个日期计算一些感兴趣的统计数据(例如,某个列的平均值),我的数据包括开始日期和结束日期列 假设我有分层数据,每行有一个IDsub列,IDsub所属的每个更广泛的类别有一个ID列,一个开始日期,一个结束日期,还有一个有意义的值: IDsub <- c("1001", "1002", "1003", "1004") ID <
IDsub
列,IDsub所属的每个更广泛的类别有一个ID
列,一个开始日期
,一个结束日期
,还有一个有意义的值
:
IDsub <- c("1001", "1002", "1003", "1004")
ID <- c("id1", "id1", "id2", "id2")
start_date <- as.Date(c("2021-01-01", "2021-01-02", "2021-01-05", "2021-01-10"))
end_date <- as.Date(c("2021-01-10", "2021-01-09", "2021-01-13", "2021-01-12"))
value <- c(1, 2, 2, 0)
df <- tibble(IDsub, ID, start_date, end_date, value)
然后转换数据,使其按日期组织:
df1 <- df %>%
transmute(ID, IDsub, value, date = map2(min(df$start_date), max(df$end_date), seq, by = "day")) %>%
unnest("date")
这就是我被绊倒的地方。我想计算每个ID
中每个日期的值的平均值,但下面的代码似乎没有这样做
df2 <- df1 %>%
group_by(ID, date) %>%
summarize(mean(value))
这是没有意义的,因为id1的2020-01-01应具有与id1的2020-01-02不同的平均值,因为2021-01-01只存在值为1的IDsub 1001,而2021-01-02分别存在值为1和2的IDsub 1001和1002。因此,2021-01-01和2021-01-02的值应该不同,但事实并非如此
我显然遗漏了一些简单的内容。我认为您的map2声明不正确。
下面是另一个可能的选项,在
功能中使用lubridate的
library(dplyr)
library(lubridate)
df <- structure(list(IDsub = c("1001", "1002", "1003", "1004"),
ID = c("id1", "id1", "id2", "id2"),
start_date = structure(c(18628, 18629, 18632, 18637), class = "Date"),
end_date = structure(c(18637, 18636, 18640, 18639), class = "Date"),
value = c(1, 2, 2, 0)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
#find start end date and create sequence
firstdate <- min(df$start_date)
lastdate <- max(df$end_date)
timeseq <-seq(firstdate, lastdate, by="1 day")
#split by id
dflist<-split(df, df$ID)
lapply(names(dflist), function(dfname){
iddf<-dflist[[dfname]]
#create time intervals for each row
intervals <-interval(iddf$start_date, iddf$end_date)
meanvalues <- sapply(timeseq, function(nrow){
withinresult <- nrow %within% intervals
mean(iddf$value[withinresult], na.rm=TRUE)
})
tibble(dfname, timeseq, meanvalues)
})
库(dplyr)
图书馆(lubridate)
df我认为您的map2声明是不正确的。
下面是另一个可能的选项,在
功能中使用lubridate的
library(dplyr)
library(lubridate)
df <- structure(list(IDsub = c("1001", "1002", "1003", "1004"),
ID = c("id1", "id1", "id2", "id2"),
start_date = structure(c(18628, 18629, 18632, 18637), class = "Date"),
end_date = structure(c(18637, 18636, 18640, 18639), class = "Date"),
value = c(1, 2, 2, 0)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
#find start end date and create sequence
firstdate <- min(df$start_date)
lastdate <- max(df$end_date)
timeseq <-seq(firstdate, lastdate, by="1 day")
#split by id
dflist<-split(df, df$ID)
lapply(names(dflist), function(dfname){
iddf<-dflist[[dfname]]
#create time intervals for each row
intervals <-interval(iddf$start_date, iddf$end_date)
meanvalues <- sapply(timeseq, function(nrow){
withinresult <- nrow %within% intervals
mean(iddf$value[withinresult], na.rm=TRUE)
})
tibble(dfname, timeseq, meanvalues)
})
库(dplyr)
图书馆(lubridate)
df id1的2020-01-01和id1的2020-01-02的值应该是多少<代码>df1%>%过滤器(介于(日期、截止日期('2021-01-01')、截止日期('2021-01-02'))之间)%>%过滤器(ID==“id1”)%>%排列(日期)
对于2021-01-01和id1,平均值应为1。2021-01-02和id1的平均值应为1.5。id1的2020-01-01和id1的2020-01-02的值应为多少<代码>df1%>%过滤器(介于(日期、截止日期('2021-01-01')、截止日期('2021-01-02'))之间)%>%过滤器(ID==“id1”)%>%排列(日期)
对于2021-01-01和id1,平均值应为1。对于2021-01-02和id1,平均值应为1.5。谢谢,这看起来很有希望。您知道如何在这里按ID分组,以便在ID内按日期报告平均值(id1的日期与id2的日期不同)?谢谢,这看起来很有希望。您知道如何在这里按ID分组,以便在ID中按日期报告平均值(id1的日期与id2的日期分开)?
ID date `mean(value)`
id1 2021-01-01 1.5
id1 2021-01-02 1.5
id1 2021-01-03 1.5
id1 2021-01-04 1.5
id1 2021-01-05 1.5
library(dplyr)
library(lubridate)
df <- structure(list(IDsub = c("1001", "1002", "1003", "1004"),
ID = c("id1", "id1", "id2", "id2"),
start_date = structure(c(18628, 18629, 18632, 18637), class = "Date"),
end_date = structure(c(18637, 18636, 18640, 18639), class = "Date"),
value = c(1, 2, 2, 0)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
#find start end date and create sequence
firstdate <- min(df$start_date)
lastdate <- max(df$end_date)
timeseq <-seq(firstdate, lastdate, by="1 day")
#split by id
dflist<-split(df, df$ID)
lapply(names(dflist), function(dfname){
iddf<-dflist[[dfname]]
#create time intervals for each row
intervals <-interval(iddf$start_date, iddf$end_date)
meanvalues <- sapply(timeseq, function(nrow){
withinresult <- nrow %within% intervals
mean(iddf$value[withinresult], na.rm=TRUE)
})
tibble(dfname, timeseq, meanvalues)
})