【问题标题】:do not count zeros but keep group number不计算零,但保留组号
【发布时间】:2020-08-11 08:50:43
【问题描述】:

我正在根据 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') 

现在,它计数为零。我不想数零,但我想将它们放在不同的组中。

我想要类似的东西:

count(ifelse(mdo != 0, grp, NA), name='count') %&gt;%

但这给出了:

Error: by can't contain join column grp which is missing from LHS

现在的结果是:

 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     3 2019-05-14  1100
16     5     3 2019-05-14  1100
17     5     3 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

我想要的结果:

 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

【问题讨论】:

  • 您能否展示给定示例的预期输出?
  • @RonakShah:我更新了帖子,谢谢
  • 所以 count 仅在第 5 组中被更改。为什么第 5 组中的 count 应该是 NA
  • @RonakShah:因为稍后当我将 1100 除以计数时,如果我将其保留为 3 个计数,它将进行除法。但是,因为 mdo 为零,我希望不发生除法,我想在那里设置零。 (当然这是个问题,怎么设置为零)
  • mdo 在第 5 组中不是 0,而是 1100。

标签: r dplyr


【解决方案1】:

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

df1 %>% 
  filter(!is.na(mdo)) %>%
  group_by(grp) %>%
  summarise(count=ifelse(mdo==0, NA_integer_, n()), .groups="drop") %>%
  distinct() %>%
  mutate(count=lag(count)) %>%
  right_join(df1, by="grp") %>%
  arrange(grp, mydate)

返回

# A tibble: 25 x 4
     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

数据

structure(list(mydate = structure(c(18027, 18027, 18027, 18027, 
18028, 18028, 18028, 18028, 18029, 18029, 18029, 18029, 18030, 
18030, 18030, 18030, 18031, 18031, 18031, 18031, 18031, 18031, 
18031, 18031, 18031), class = "Date"), 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), grp = c(1L, 1L, 1L, 
1L, 1L, 1L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 
6L, 6L, 7L, 7L, 7L, 8L)), row.names = c(NA, -25L), class = c("tbl_df", 
"tbl", "data.frame"))

【讨论】:

  • 它给了Error: Column count must be length 1 not 6
  • 这很奇怪。我使用上面显示的数据为df1,并且我能够运行代码而不会出现错误。
  • 可能存在版本依赖性?我找不到解决此问题的方法。
  • 您的dplyr 版本是什么?我正在使用1.0.0
【解决方案2】:

加入前可以将mdo的值保留在summarise中,如果mdo中的前一个值为0,则将count的值转为NA

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2011-04-23
    • 2021-01-07
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多