簡體   English   中英

將隨機觀察值的總和計算為 R 中的每周總和

[英]Calculate Sum of Random observations as sum per week in R

我有一個隨機的、有時不頻繁的事件數據集,我想將其計為每周總和。 由於隨機性,它們不是線性的,所以到目前為止我嘗試過的其他示例不適用。

數據類似這樣:


df_date <- data.frame( Name = c("Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim",
                                "Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue"),
                       Dates = c("2010-1-1", "2010-1-2", "2010-01-5","2010-01-17","2010-01-20",
                                 "2010-01-29","2010-02-6","2010-02-9","2010-02-16","2010-02-28",
                                 "2010-1-1", "2010-1-2", "2010-01-5","2010-01-17","2010-01-20",
                                 "2010-01-29","2010-02-6","2010-02-9","2010-02-16","2010-02-28"),
                       Event = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) )

我想要做的是創建一個新表,其中包含日歷年中每周的事件總和。

在這種情況下產生這樣的東西:

Name   Week   Events
Jim    1      3
Sue    1      3
Jim    2      0
Sue    x ...  x 

and so on...

多年更新OP請求:

我們也可以使用isoweek中的lubridate而不是week

或者:

我們可以按如下方式添加年份:

df_date %>% 
  as_tibble() %>% 
  mutate(Week = week(ymd(Dates))) %>% 
  mutate(Year = year(ymd(Dates))) %>% 
  count(Name, Year, Week)

在使用 lubridate s ymd function 將字符Dates轉換為日期格式后,我們可以使用lubridate s Week lubridate然后我們可以使用count ,它是group_by(Name, Week) %>% summarise(Count = n())的縮寫:

library(dplyr)
library(lubridate)
df_date %>% 
  as_tibble() %>% 
  mutate(Week = week(ymd(Dates))) %>% 
  count(Name, Week)
  Name   Week     n
   <chr> <dbl> <int>
 1 Jim       1     3
 2 Jim       3     2
 3 Jim       5     1
 4 Jim       6     2
 5 Jim       7     1
 6 Jim       9     1
 7 Sue       1     3
 8 Sue       3     2
 9 Sue       5     1
10 Sue       6     2
11 Sue       7     1
12 Sue       9     1

這是一種方法,可以讓您獲得每個人的每個 ISO 周,當該周沒有針對該人的事件時為零:

get_dates_df <- function(d) {
  data.frame(date = seq(min(d, na.rm=T),max(d,na.rm=T),1)) %>% 
    mutate(Year=year(date), Week=week(date)) %>% 
    distinct(Year, Week)    
}

df_date = df_date %>% mutate(Dates=lubridate::ymd(Dates))

left_join(
  full_join(distinct(df_date %>% select(Name)), get_dates_df(df_date$Dates), by=character()),
  df_date %>% 
  group_by(Name,Year=year(Dates), Week=week(Dates)) %>% 
  summarize(Events = sum(Event), .groups="drop")
) %>% 
  mutate(Events=if_else(is.na(Events),0,Events))

Output:

   Name Year Week Events
1   Jim 2010    1      3
2   Jim 2010    2      0
3   Jim 2010    3      2
4   Jim 2010    4      0
5   Jim 2010    5      1
6   Jim 2010    6      2
7   Jim 2010    7      1
8   Jim 2010    8      0
9   Jim 2010    9      1
10  Sue 2010    1      3
11  Sue 2010    2      0
12  Sue 2010    3      2
13  Sue 2010    4      0
14  Sue 2010    5      1
15  Sue 2010    6      2
16  Sue 2010    7      1
17  Sue 2010    8      0
18  Sue 2010    9      1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM