Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr按日期之间的总结分组_R_Dplyr_Tidyverse - Fatal编程技术网

使用dplyr按日期之间的总结分组

使用dplyr按日期之间的总结分组,r,dplyr,tidyverse,R,Dplyr,Tidyverse,在使用summary时,我很难理解dplyr中的一些逻辑 我感兴趣的是为每个ID中的每个日期计算一些感兴趣的统计数据(例如,某个列的平均值),我的数据包括开始日期和结束日期列 假设我有分层数据,每行有一个IDsub列,IDsub所属的每个更广泛的类别有一个ID列,一个开始日期,一个结束日期,还有一个有意义的值: IDsub <- c("1001", "1002", "1003", "1004") ID <

在使用summary时,我很难理解dplyr中的一些逻辑

我感兴趣的是为每个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)
})