【问题标题】:How to calculate events per day in R including dates when no events occurred?如何计算 R 中每天的事件,包括没有事件发生的日期?
【发布时间】:2020-05-03 18:14:02
【问题描述】:

我想创建一个数据框,其中第一列中包含特定时间段的所有日期,第二列中包含每个日期发生的事件数,包括未发生事件的日期。我还想统计分配了特定因素的事件

第一个数据框,其中包含给定日期的事件:

Row Sex Age      Date
1    2   36   2004-01-05
2    1   47   2004-01-06
3    1   26   2004-01-10
4    2   23   2004-01-20
5    1   50   2004-01-27
6    2   35   2004-01-28
7    1   35   2004-01-30
8    1   38   2004-02-06
9    2   29   2004-02-11

在“性别”列中,1 表示女性,2 表示男性。

第二个数据框,其中包含检查期间的日期:

行日期

1  2004-01-05
 2  2004-01-06
 3  2004-01-07
 4  2004-01-08
 5  2004-01-09
 6  2004-01-10
 7  2004-01-11
 8  2004-01-12
 9  2004-01-13
10  2004-01-14

我想得到一个如下所示的数据框:

Row    Date       Events (All)   Events (Female)   Events (Male)
 1  2004-01-05         1                0                1
 2  2004-01-06         1                1                0
 3  2004-01-07         0                0                0
 4  2004-01-08         0                0                0
 5  2004-01-09         0                0                0
 6  2004-01-10         0                1                0
 7  2004-01-11         0                0                0
 8  2004-01-12         0                0                0
 9  2004-01-13         0                0                0
10  2004-01-14         0                0                0

谁能帮忙?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一种方法:

    library(data.table)
    library(magrittr) # just for %>%
    out <- dat1 %>%
      dcast(Date ~ Sex, data = ., fun.aggregate = length) %>%
      setnames(., c("1", "2"), c("Female", "Male")) %>%
      .[ dat2[ , .(Date)], on = "Date" ] %>%
      .[, lapply(.SD, function(a) replace(a, is.na(a), 0)), ] %>%
      .[, All := Female + Male ]
    out
    #           Date Female Male All
    #  1: 2004-01-05      0    1   1
    #  2: 2004-01-06      1    0   1
    #  3: 2004-01-07      0    0   0
    #  4: 2004-01-08      0    0   0
    #  5: 2004-01-09      0    0   0
    #  6: 2004-01-10      1    0   1
    #  7: 2004-01-11      0    0   0
    #  8: 2004-01-12      0    0   0
    #  9: 2004-01-13      0    0   0
    # 10: 2004-01-14      0    0   0
    

    请注意,使用lapply 可能不是将NA 替换为0 的整体最快方法,但它明白了这一点。另外,我使用magrittr::%&gt;% 只是为了突破步骤,不用%&gt;% 也可以轻松完成。

    数据:

    dat1 <- fread(text = "
    Row Sex Age      Date
    1    2   36   2004-01-05
    2    1   47   2004-01-06
    3    1   26   2004-01-10
    4    2   23   2004-01-20
    5    1   50   2004-01-27
    6    2   35   2004-01-28
    7    1   35   2004-01-30
    8    1   38   2004-02-06
    9    2   29   2004-02-11")
    
    dat2 <- fread(text = "
    Row Date
     1  2004-01-05
     2  2004-01-06
     3  2004-01-07
     4  2004-01-08
     5  2004-01-09
     6  2004-01-10
     7  2004-01-11
     8  2004-01-12
     9  2004-01-13
    10  2004-01-14")
    

    tidyversion:

    
    dat1 <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
    Row Sex Age      Date
    1    2   36   2004-01-05
    2    1   47   2004-01-06
    3    1   26   2004-01-10
    4    2   23   2004-01-20
    5    1   50   2004-01-27
    6    2   35   2004-01-28
    7    1   35   2004-01-30
    8    1   38   2004-02-06
    9    2   29   2004-02-11")
    
    dat2 <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
    Row Date
     1  2004-01-05
     2  2004-01-06
     3  2004-01-07
     4  2004-01-08
     5  2004-01-09
     6  2004-01-10
     7  2004-01-11
     8  2004-01-12
     9  2004-01-13
    10  2004-01-14")
    
    library(dplyr)
    library(tidyr)
    as_tibble(dat1) %>%
      group_by(Date, Sex) %>%
      tally() %>%
      ungroup() %>%
      pivot_wider(id_cols = "Date", names_from = "Sex", values_from = "n",
                  values_fill = list(n = 0)) %>%
      rename(Female = "1", Male = "2") %>%
      left_join(select(dat2, Date), ., by = "Date") %>%
      mutate_at(vars(Female, Male), ~ replace(., is.na(.), 0)) %>%
      mutate(All = Female + Male)
    

    【讨论】:

    • 感谢您的回答!我试过整理版。不幸的是,发生了一个我不知道如何处理的错误。 “错误:by 不能包含 RHS 中缺少的连接列 Date”知道可能是什么原因造成的吗?
    • 这表示您要加入的第二个框架中没有Date 列。确保大小写相同,等等(在left_join(dat2, .)的情况下,rhs是dat1 post-pipe。)
    猜你喜欢
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2010-10-17
    相关资源
    最近更新 更多