如何获得整体重复计数?

时间:2018-06-12 06:27:55

标签: r dplyr

我有下面提到的数据框:

DF <- read.table(text = "
Date         ID
2018-04-01   K-1
2018-04-01   K-1
2018-04-01   K-8
2018-04-02   K-2
2018-04-02   K-2
2018-04-03   K-2
2018-04-03   K-2
2018-04-03   K-2
2018-04-04   K-3
2018-05-01   K-5
2018-05-01   K-5
2018-05-02   K-6
2018-05-02   K-7", header = TRUE, stringsAsFactors = FALSE)

通过使用上面提到的datafram,我想确定下面提到的指标:

Date       Unique_count      Duplicate_Count      Overall_Duplicate
2018-04-01 2                 1                    0
2018-04-02 1                 1                    0
2018-04-03 0                 0                    3
2018-04-04 1                 0                    0
2018-05-01 1                 1                    0
2018-05-02 2                 0                    0

其中:

  • Unique_count - 针对特定日期创建的区别ID ID不应与之前的ID匹配。

  • Duplicate_count - 额外数量(如果有2 K-1比 - Duplicate_count应为1)相同ID生成的特定日期,相同ID不应与之前的任何ID匹配。

  • Overall_Duplicate - 先前已生成并再次出现在特定日期的ID计数。

我有下面提到的代码,不确定Overall_Duplicate

library(dplyr)

DF2 <- DF %>%
  group_by(Date) %>%
  summarise(Unique_Count  = n_distinct(ID),
            Duplicate_Count = sum(table(ID)>1))

2 个答案:

答案 0 :(得分:1)

如果您首先按ID进行分组并找到第一次出现每个ID,则可以将所有后续ID(在它们第一次出现之后)更改为NA,然后进行一些计算以获得所需内容。

DF %>%
  group_by(ID) %>%
  mutate(first_time = min(Date)) %>% 
  ungroup() %>% 
  mutate(ID = ifelse(Date == first_time, ID, NA)) %>% 
  group_by(Date) %>% 
  summarise(Unique_Count = n_distinct(ID, na.rm = TRUE),
            Overall_Duplicate = sum(is.na(ID)),
            Duplicate_Count = n() - Unique_Count - Overall_Duplicate)

答案 1 :(得分:0)

你可以尝试这样的事情。但根据您可重复的数据,它是硬编码的。在现实生活中可能存在误报。

library(tidyverse)
DF %>%
  mutate(id=duplicated(ID)) %>% 
  group_by(ID) %>% 
  mutate(OLdate=n_distinct(Date)>1) %>% 
  group_by(Date) %>% 
  summarise(Unique_count=sum(!na_if(id, T), na.rm = T),
            Duplicate_Count=ifelse(Unique_count == 0, 0, sum(id)),
            Overall_Duplicate=ifelse(Unique_count == 0,sum(OLdate), 0)) 
# A tibble: 6 x 4
  Date       Unique_count Duplicate_Count Overall_Duplicate
  <chr>             <int>           <dbl>             <dbl>
1 2018-04-01            2               1                 0
2 2018-04-02            1               1                 0
3 2018-04-03            0               0                 3
4 2018-04-04            1               0                 0
5 2018-05-01            1               1                 0
6 2018-05-02            2               0                 0