Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
基于R中的稀疏变量按组创建日期范围_R_Date_Dplyr_Time Series_Tidyverse - Fatal编程技术网

基于R中的稀疏变量按组创建日期范围

基于R中的稀疏变量按组创建日期范围,r,date,dplyr,time-series,tidyverse,R,Date,Dplyr,Time Series,Tidyverse,我有一个稀疏的数据,它有一个周期性的分数,和一个更定期的多个受试者的测量,以及相应的日期。我想根据每个受试者ID的评分日期生成日期范围,即从评分日期开始到下一个评分日期结束(或者如果评分不在这些日期,则从第一个/最后一个受试者观察开始/结束) 然后,我想平均这些日期范围内的测量变量。平均步骤应该很简单,但我一直在生成日期范围 下面是一个数据示例和一个我将如何设想结果数据的示例 样本数据: structure(list(ID = c("A", "A", &q

我有一个稀疏的数据,它有一个周期性的分数,和一个更定期的多个受试者的测量,以及相应的日期。我想根据每个受试者ID的评分日期生成日期范围,即从评分日期开始到下一个评分日期结束(或者如果评分不在这些日期,则从第一个/最后一个受试者观察开始/结束)

然后,我想平均这些日期范围内的测量变量。平均步骤应该很简单,但我一直在生成日期范围

下面是一个数据示例和一个我将如何设想结果数据的示例

样本数据:

structure(list(ID = c("A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", 
"B", "B", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", 
"D", "D", "D", "D", "D", "D", "D"), date = c("1/21/2020", "1/27/2020", 
"2/1/2020", "2/3/2020", "2/5/2020", "2/6/2020", "2/8/2020", "2/9/2020", 
"2/11/2020", "2/12/2020", "2/13/2020", "2/15/2020", "2/18/2020", 
"2/20/2020", "2/21/2020", "2/22/2020", "2/25/2020", "2/1/2020", 
"2/5/2020", "2/7/2020", "2/8/2020", "2/11/2020", "2/12/2020", 
"1/30/2020", "2/10/2020", "2/11/2020", "2/6/2020", "2/7/2020", 
"2/8/2020", "2/9/2020", "2/11/2020", "2/13/2020", "2/14/2020", 
"2/16/2020", "2/17/2020", "2/20/2020", "2/23/2020", "2/26/2020", 
"3/1/2020", "3/3/2020", "3/5/2020"), score = c(0.5, 2, NA, NA, 
3, NA, NA, NA, NA, NA, 2.5, NA, NA, 1.5, NA, NA, NA, 3, NA, NA, 
2.5, NA, 1, 0.5, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 14, 
NA, NA, 11.5, NA, 9.5, NA), measure = c(0.394160734, 0.722462998, 
0.82984815, 0.738432745, 0.321792398, 0.167492308, 0.218020898, 
0.929210786, 0.686818585, 0.939678073, 0.708172942, 0.299863884, 
0.48216267, 0.290307369, 0.801947902, 0.579418467, 0.78101844, 
0.219494852, 0.875129822, 0.517971003, 0.475625007, 0.723003744, 
0.257473477, 0.629818537, 0.817369151, 0.628573413, 0.364660834, 
0.5971024, 0.002274261, 0.318937617, 0.983917106, 0.685933928, 
0.487922831, 0.151769304, 0.392413694, 0.012429414, 0.149627658, 
0.011724992, 0.536998203, 0.798399999, 0.763353822)), class = "data.frame", row.names = c(NA, 
-41L))
答复数据:

structure(list(ID = c("A", "A", "A"), startDate = c("1/21/2020", 
"1/27/2020", "2/5/2020"), endDate = c("1/27/2020", "2/5/2020", 
"2/13/2020"), score = c(0.5, 2, 3), measure = c(0.394160734, 
0.763581298, 0.543835508)), class = "data.frame", row.names = c(NA, 
-3L))

这里有一种使用dplyr的方法:

library(dplyr)

df %>%
  group_by(ID, grp = cumsum(!is.na(score))) %>%
  summarise(start_date = first(date),
            score = first(score),
            measure = mean(measure)) %>%
  mutate(end_date = lead(start_date, default = last(start_date))) %>%
  select(-grp)

#       ID    start_date score measure end_date 
#   <chr> <chr>      <dbl>   <dbl> <chr>    
# 1 A     1/21/2020    0.5   0.394 1/27/2020
# 2 A     1/27/2020    2     0.764 2/5/2020 
# 3 A     2/5/2020     3     0.544 2/13/2020
# 4 A     2/13/2020    2.5   0.497 2/20/2020
# 5 A     2/20/2020    1.5   0.613 2/20/2020
# 6 B     2/1/2020     3     0.538 2/8/2020 
# 7 B     2/8/2020     2.5   0.599 2/12/2020
# 8 B     2/12/2020    1     0.257 2/12/2020
# 9 C     1/30/2020    0.5   0.692 1/30/2020
#10 D     2/6/2020    NA     0.449 2/17/2020
#11 D     2/17/2020   14     0.185 2/26/2020
#12 D     2/26/2020   11.5   0.274 3/3/2020 
#13 D     3/3/2020     9.5   0.781 3/3/2020 
库(dplyr)
df%>%
分组依据(ID,grp=cumsum(!is.na(分数)))%>%
总结(开始日期=第一个(日期),
分数=第一(分数),
测量值=平均值(测量值))%>%
变异(结束日期=潜在客户(开始日期,默认值=最后一次(开始日期))%>%
选择(-grp)
#ID开始日期得分测量结束日期
#                  
#1A 2020年1月21日0.50.394 2020年1月27日
#2 A 1/27/2020 2 0.764 2/5/2020
#3 A 2020年2月5日3 0.544 2020年2月13日
#4 A 2/13/2020 2.5 0.497 2/20/2020
#5 A 2020年2月20日1.5 0.613 2020年2月20日
#6 B 2020年2月1日3 0.538 2020年2月8日
#7 B 2/8/2020 2.5 0.599 2/12/2020
#8 B 2020年12月2日10.257 2020年12月2日
#9 C 2020年1月30日0.50.692 2020年1月30日
#10 D 2020年2月6日NA 0.449 2020年2月17日
#11 D 2020年2月17日14 0.185 2020年2月26日
#12 D 2020年2月26日11.5 0.274 2020年3月3日
#13 D 2020年3月3日9.5 0.781 2020年3月3日

这里有一种使用dplyr的方法:

library(dplyr)

df %>%
  group_by(ID, grp = cumsum(!is.na(score))) %>%
  summarise(start_date = first(date),
            score = first(score),
            measure = mean(measure)) %>%
  mutate(end_date = lead(start_date, default = last(start_date))) %>%
  select(-grp)

#       ID    start_date score measure end_date 
#   <chr> <chr>      <dbl>   <dbl> <chr>    
# 1 A     1/21/2020    0.5   0.394 1/27/2020
# 2 A     1/27/2020    2     0.764 2/5/2020 
# 3 A     2/5/2020     3     0.544 2/13/2020
# 4 A     2/13/2020    2.5   0.497 2/20/2020
# 5 A     2/20/2020    1.5   0.613 2/20/2020
# 6 B     2/1/2020     3     0.538 2/8/2020 
# 7 B     2/8/2020     2.5   0.599 2/12/2020
# 8 B     2/12/2020    1     0.257 2/12/2020
# 9 C     1/30/2020    0.5   0.692 1/30/2020
#10 D     2/6/2020    NA     0.449 2/17/2020
#11 D     2/17/2020   14     0.185 2/26/2020
#12 D     2/26/2020   11.5   0.274 3/3/2020 
#13 D     3/3/2020     9.5   0.781 3/3/2020 
库(dplyr)
df%>%
分组依据(ID,grp=cumsum(!is.na(分数)))%>%
总结(开始日期=第一个(日期),
分数=第一(分数),
测量值=平均值(测量值))%>%
变异(结束日期=潜在客户(开始日期,默认值=最后一次(开始日期))%>%
选择(-grp)
#ID开始日期得分测量结束日期
#                  
#1A 2020年1月21日0.50.394 2020年1月27日
#2 A 1/27/2020 2 0.764 2/5/2020
#3 A 2020年2月5日3 0.544 2020年2月13日
#4 A 2/13/2020 2.5 0.497 2/20/2020
#5 A 2020年2月20日1.5 0.613 2020年2月20日
#6 B 2020年2月1日3 0.538 2020年2月8日
#7 B 2/8/2020 2.5 0.599 2/12/2020
#8 B 2020年12月2日10.257 2020年12月2日
#9 C 2020年1月30日0.50.692 2020年1月30日
#10 D 2020年2月6日NA 0.449 2020年2月17日
#11 D 2020年2月17日14 0.185 2020年2月26日
#12 D 2020年2月26日11.5 0.274 2020年3月3日
#13 D 2020年3月3日9.5 0.781 2020年3月3日

使用
数据表

library(data.table)
setDT(df)[, .(start_date = first(date),
              score = first(score),
              measure = mean(measure)), 
             by = .(ID, grp = cumsum(!is.na(score)))
        ][, end_date := shift(start_date, type= 'lead', fill = last(start_date))
          ][, grp := NULL][]

使用
数据表

library(data.table)
setDT(df)[, .(start_date = first(date),
              score = first(score),
              measure = mean(measure)), 
             by = .(ID, grp = cumsum(!is.na(score)))
        ][, end_date := shift(start_date, type= 'lead', fill = last(start_date))
          ][, grp := NULL][]

很好,谢谢。对于相同的情况(当前为NA值),是否有办法将开始日期值放入结束日期?是的,我们可以在
lead
中添加
default
值。更新了答案。效果很好,谢谢。对于相同的情况(当前为NA值),是否有办法将开始日期值放入结束日期?是的,我们可以在
lead
中添加
default
值。更新了答案。