cumsum NAs和其他条件R

cumsum NAs和其他条件R,r,if-statement,dplyr,cumsum,R,If Statement,Dplyr,Cumsum,我见过很多像这样的问题,但不能解决这个简单的问题。我不想折叠数据集。假设我有这个数据集: library(tidyverse) library(lubridate) df <- data.frame(group = c("a", "a", "a", "a", "a", "b", "b", "b"), starts = c("2011-09-18", NA, "2014-08-08", "2016-09-18", NA, "2013-08-08", "20

我见过很多像这样的问题,但不能解决这个简单的问题。我不想折叠数据集。假设我有这个数据集:

library(tidyverse)
library(lubridate)
df <- data.frame(group = c("a", "a", "a", "a", "a", "b", "b", "b"),
                 starts = c("2011-09-18", NA,  "2014-08-08", "2016-09-18", NA, "2013-08-08", "2015-08-08", NA),
                 ends = c(NA, "2013-03-06", "2015-08-08", NA, "2017-03-06", "2014-08-08", NA, "2016-08-08"))
df$starts <- parse_date_time(df$starts, "ymd")
df$ends <- parse_date_time(df$ends, "ymd")
df

  group     starts       ends
1     a 2011-09-18       <NA>
2     a       <NA> 2013-03-06
3     a 2014-08-08 2015-08-08
4     a 2016-09-18       <NA>
5     a       <NA> 2017-03-06
6     b 2013-08-08 2014-08-08
7     b 2015-08-08       <NA>
8     b       <NA> 2016-08-08
我不知道如何将
cumsum(is.na)
与条件
if\u else
合并。也许我走错方向了


任何建议都很好。

一个选项是获取列“开始”、“结束”的
行和
NA
元素,按“组”分组,从“epi”获取
rleid

library(dplyr)
library(data.table)
df %>% 
    mutate(epi =  rowSums(is.na(.[c("starts", "ends")]))) %>% 
    group_by(group) %>%
    mutate(epi = rleid(epi))
# A tibble: 8 x 4
# Groups:   group [2]
#  group starts              ends                  epi
#  <fct> <dttm>              <dttm>              <int>
#1 a     2011-09-18 00:00:00 NA                      1
#2 a     NA                  2013-03-06 00:00:00     1
#3 a     2014-08-08 00:00:00 2015-08-08 00:00:00     2
#4 a     2016-09-18 00:00:00 NA                      3
#5 a     NA                  2017-03-06 00:00:00     3
#6 b     2013-08-08 00:00:00 2014-08-08 00:00:00     1
#7 b     2015-08-08 00:00:00 NA                      2
#8 b     NA                  2016-08-08 00:00:00     2

使用
dplyr
的解决方案。假设您的数据帧结构良好,每个开始总是有一个关联的结束记录

df2 <- df %>%
  group_by(group) %>%
  mutate(epi = cumsum(!is.na(starts))) %>%
  ungroup()
df2
# # A tibble: 8 x 4
#   group starts              ends                  epi
#   <fct> <dttm>              <dttm>              <int>
# 1 a     2011-09-18 00:00:00 NA                      1
# 2 a     NA                  2013-03-06 00:00:00     1
# 3 a     2014-08-08 00:00:00 2015-08-08 00:00:00     2
# 4 a     2016-09-18 00:00:00 NA                      3
# 5 a     NA                  2017-03-06 00:00:00     3
# 6 b     2013-08-08 00:00:00 2014-08-08 00:00:00     1
# 7 b     2015-08-08 00:00:00 NA                      2
# 8 b     NA                  2016-08-08 00:00:00     2
df2%
分组依据(分组)%>%
突变(epi=cumsum(!is.na(开始))%>%
解组()
df2
##A tibble:8 x 4
#小组开始结束计划免疫
#                                
#1A 2011-09-18 00:00:00北美1
#2 a NA 2013-03-06 00:00:00 1
#2014-08-08 00:00:00 2015-08-08 00:00:00 2
#4a 2016-09-18 00:00:00NA 3
#5a北美2017-03-06 00:00:00 3
#6b 2013-08-08 00:00:00 2014-08-08 00:00:00 1
#7b 2015-08-08 00:00:00NA 2
#8 b北美2016-08-08 00:00:00 2
library(dplyr)
library(data.table)
df %>% 
    mutate(epi =  rowSums(is.na(.[c("starts", "ends")]))) %>% 
    group_by(group) %>%
    mutate(epi = rleid(epi))
# A tibble: 8 x 4
# Groups:   group [2]
#  group starts              ends                  epi
#  <fct> <dttm>              <dttm>              <int>
#1 a     2011-09-18 00:00:00 NA                      1
#2 a     NA                  2013-03-06 00:00:00     1
#3 a     2014-08-08 00:00:00 2015-08-08 00:00:00     2
#4 a     2016-09-18 00:00:00 NA                      3
#5 a     NA                  2017-03-06 00:00:00     3
#6 b     2013-08-08 00:00:00 2014-08-08 00:00:00     1
#7 b     2015-08-08 00:00:00 NA                      2
#8 b     NA                  2016-08-08 00:00:00     2
df %>% 
  group_by(group) %>%
  mutate(epi = rleid(is.na(starts) + is.na(ends)))
df2 <- df %>%
  group_by(group) %>%
  mutate(epi = cumsum(!is.na(starts))) %>%
  ungroup()
df2
# # A tibble: 8 x 4
#   group starts              ends                  epi
#   <fct> <dttm>              <dttm>              <int>
# 1 a     2011-09-18 00:00:00 NA                      1
# 2 a     NA                  2013-03-06 00:00:00     1
# 3 a     2014-08-08 00:00:00 2015-08-08 00:00:00     2
# 4 a     2016-09-18 00:00:00 NA                      3
# 5 a     NA                  2017-03-06 00:00:00     3
# 6 b     2013-08-08 00:00:00 2014-08-08 00:00:00     1
# 7 b     2015-08-08 00:00:00 NA                      2
# 8 b     NA                  2016-08-08 00:00:00     2