R 不计算零,但保留组号
我根据mdo值对数据进行分组,并计算这些值的实例。 然后我使用前面的计数进行一些计算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",
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