R 不计算零,但保留组号

R 不计算零,但保留组号,r,dplyr,R,Dplyr,我根据mdo值对数据进行分组,并计算这些值的实例。 然后我使用前面的计数进行一些计算 library(tidyverse) library(dplyr) df <- tibble(mydate = as.Date(c("2019-05-11 23:01:00", "2019-05-11 23:02:00", "2019-05-11 23:03:00", "2019-05-11 23:04:00",

我根据mdo值对数据进行分组,并计算这些值的实例。 然后我使用前面的计数进行一些计算

library(tidyverse)
library(dplyr)

df <- tibble(mydate = as.Date(c("2019-05-11 23:01:00", "2019-05-11 23:02:00", "2019-05-11 23:03:00", "2019-05-11 23:04:00",
                                "2019-05-12 23:05:00", "2019-05-12 23:06:00", "2019-05-12 23:07:00", "2019-05-12 23:08:00",
                                "2019-05-13 23:09:00", "2019-05-13 23:10:00", "2019-05-13 23:11:00", "2019-05-13 23:12:00",
                                "2019-05-14 23:13:00", "2019-05-14 23:14:00", "2019-05-14 23:15:00", "2019-05-14 23:16:00",
                                "2019-05-15 23:17:00", "2019-05-15 23:18:00", "2019-05-15 23:19:00", "2019-05-15 23:20:00",
                                "2019-05-15 23:21:00", "2019-05-15 23:22:00", "2019-05-15 23:23:00", "2019-05-15 23:24:00",
                                "2019-05-15 23:25:00")),
             mdo = c(1500, 1500, 1500, 1500,
                     1500, 1500, NA, 0,
                     0, 0, NA, NA, NA, NA, 1100, 1100,
                     1100, 200, 200, 200,200,
                     1100, 1100, 1100, 0
             ))


#Create a group number
df1 <- df %>% mutate(grp = data.table::rleid(mdo))

df1 <- df1 %>%
    #Keep only non-NA value
    filter(!is.na(mdo)) %>%
    #count occurence of each grp
    count(grp, name = 'count') %>%
    #Shift the count to the previous group
    mutate(count = lag(count)) %>%
    #Join with the original data
    right_join(df1, by = 'grp') 
我想要的结果是:

 grp count mydate       mdo
   <int> <int> <date>     <dbl>
 1     1    NA 2019-05-11  1500
 2     1    NA 2019-05-11  1500
 3     1    NA 2019-05-11  1500
 4     1    NA 2019-05-11  1500
 5     1    NA 2019-05-12  1500
 6     1    NA 2019-05-12  1500
 7     2    NA 2019-05-12    NA
 8     3     6 2019-05-12     0
 9     3     6 2019-05-13     0
10     3     6 2019-05-13     0
11     4    NA 2019-05-13    NA
12     4    NA 2019-05-13    NA
13     4    NA 2019-05-14    NA
14     4    NA 2019-05-14    NA
15     5    NA 2019-05-14  1100
16     5    NA 2019-05-14  1100
17     5    NA 2019-05-15  1100
18     6     3 2019-05-15   200
19     6     3 2019-05-15   200
20     6     3 2019-05-15   200
21     6     3 2019-05-15   200
22     7     4 2019-05-15  1100
23     7     4 2019-05-15  1100
24     7     4 2019-05-15  1100
25     8     3 2019-05-15     0

我不能100%确定您的底层逻辑是如何工作的,但您可以使用dplyr尝试以下步骤:

df1%>% 滤器is.namdo%>% 组_bygrp%>% SummarseCount=ifelsemdo==0,NA_整数,n,.groups=drop%>% 不同%>% mutatecount=lagcount%>% 右接缝1,by=grp%>% arrangegrp,mydate 返回

一个tibble:25 x 4 grp计数mydate mdo 1 NA 2019-05-11 1500 2 1 NA 2019-05-11 1500 3 1 NA 2019-05-11 1500 4 1 NA 2019-05-11 1500 5 1 NA 2019-05-12 1500 6 1 NA 2019-05-12 1500 7 2北美2019-05-12北美 8 3 6 2019-05-12 0 9 3 6 2019-05-13 0 10 3 6 2019-05-13 0 11 4北美2019-05-13北美 12 4北美2019-05-13北美 13 4北美2019-05-14北美 14 4北美2019-05-14北美 15 5 NA 2019-05-14 1100 165NA 2019-05-141100 17.5北美2019-05-15 1100 18 6 3 2019-05-15 200 19 6 3 2019-05-15 200 20 6 3 2019-05-15 200 21 6 3 2019-05-15 200 22 7 4 2019-05-15 1100 23 7 4 2019-05-15 1100 24 7 4 2019-05-15 1100 25 8 3 2019-05-15 0 数据 structurelistmydate=structurec18027、18027、18027、, 18028, 18028, 18028, 18028, 18029, 18029, 18029, 18029, 18030, 18030, 18030, 18030, 18031, 18031, 18031, 18031, 18031, 18031, 180311803118031,class=Date,mdo=C150015001500, 1500,1500,1500,NA,0,0,NA,NA,NA,1100,1100, 200200200200110011000,grp=c1L,1L,1L, 1L,1L,1L,2L,3L,3L,4L,4L,4L,5L,5L,5L,5L,6L,6L, 6L,6L,7L,7L,7L,8L,row.NAME=cNA,-25L,class=ctbl_df, tbl,data.frame
加入之前,您可以将mdo的值保留在Summary中,如果mdo中的上一个值为0,请将计数值改为NA


你能为给定的例子展示你的预期输出吗?@RonakShah:我更新了帖子,只有第5组的Thankso计数发生了变化。为什么第5组的计数应该是NA?@RonakShah:因为稍后当我将1100除以计数时,如果我将其保留3个计数,它将进行除法。但是,因为mdo是零,我不希望除法发生,我想在那里设置零。当然这是一个问题,如何设置它zeromdo在第5组中不是0,它是1100。它给出了错误:列计数必须是长度1而不是6这是奇数。我使用了上面显示的数据作为df1,并且我能够在没有错误的情况下运行代码?我找不到纠正的方法。你的dplyr版本是什么?我用的是1.0.0。
 grp count mydate       mdo
   <int> <int> <date>     <dbl>
 1     1    NA 2019-05-11  1500
 2     1    NA 2019-05-11  1500
 3     1    NA 2019-05-11  1500
 4     1    NA 2019-05-11  1500
 5     1    NA 2019-05-12  1500
 6     1    NA 2019-05-12  1500
 7     2    NA 2019-05-12    NA
 8     3     6 2019-05-12     0
 9     3     6 2019-05-13     0
10     3     6 2019-05-13     0
11     4    NA 2019-05-13    NA
12     4    NA 2019-05-13    NA
13     4    NA 2019-05-14    NA
14     4    NA 2019-05-14    NA
15     5    NA 2019-05-14  1100
16     5    NA 2019-05-14  1100
17     5    NA 2019-05-15  1100
18     6     3 2019-05-15   200
19     6     3 2019-05-15   200
20     6     3 2019-05-15   200
21     6     3 2019-05-15   200
22     7     4 2019-05-15  1100
23     7     4 2019-05-15  1100
24     7     4 2019-05-15  1100
25     8     3 2019-05-15     0
library(dplyr)
df1 %>%
  filter(!is.na(mdo)) %>%
  group_by(grp) %>%
  summarise(mdo = first(mdo), 
            count = n()) %>%
  mutate(count = ifelse(lag(mdo) == 0, NA, lag(count))) %>%
  right_join(df1, by = c('grp', 'mdo'))  %>%
  arrange(grp)

#   grp  mdo count     mydate
#1    1 1500    NA 2019-05-11
#2    1 1500    NA 2019-05-11
#3    1 1500    NA 2019-05-11
#4    1 1500    NA 2019-05-11
#5    1 1500    NA 2019-05-12
#6    1 1500    NA 2019-05-12
#7    2   NA    NA 2019-05-12
#8    3    0     6 2019-05-12
#9    3    0     6 2019-05-13
#10   3    0     6 2019-05-13
#11   4   NA    NA 2019-05-13
#12   4   NA    NA 2019-05-13
#13   4   NA    NA 2019-05-14
#14   4   NA    NA 2019-05-14
#15   5 1100    NA 2019-05-14
#16   5 1100    NA 2019-05-14
#17   5 1100    NA 2019-05-15
#18   6  200     3 2019-05-15
#19   6  200     3 2019-05-15
#20   6  200     3 2019-05-15
#21   6  200     3 2019-05-15
#22   7 1100     4 2019-05-15
#23   7 1100     4 2019-05-15
#24   7 1100     4 2019-05-15
#25   8    0     3 2019-05-15