计算随机观察总和每周在R中的总和

发布于 2025-01-26 04:34:05 字数 952 浏览 3 评论 0原文

我有一个随机的数据集,有时是不频繁的事件,我想将其视为每周的总和。由于它们的随机性不是线性的,因此到目前为止我尝试过的其他示例不适用。

数据与此相似:


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...

I have a dataset of random, sometimes infrequent, events that I want to count as a sum per week. Due to the randomness they are not linear so other examples I have tried so far are not applicable.

The data is similar to this:


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) )

What I'm trying to do is create a new table that contains the sum of events per week in the calendar year.

In this case producing something like this:

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

and so on...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

和影子一齐双人舞 2025-02-02 04:34:05

更新多年来的OP请求:

我们可以使用ISOWEEK也可以从lubridate而不是Week

或:

我们可以按以下方式添加年度:

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

我们可以使用lubridate s week 转换字符date dates 使用lubridate s ymd函数。
然后,我们可以使用count,这是group_by(name,Week)%&gt;%总结的简称(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

Update OP request for multiple years:

We could use isoweek also from lubridate instead of week

OR:

We could add the year as follows:

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

We could use lubridates Week function after transforming character Dates to date format with lubridates ymd function.
Then we can use count which is the short for 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
聊慰 2025-02-02 04:34:05

这是一种为每个人带来每个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))

输出:

   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

Here is an approach that gets you each ISO week for each individual, with zeros when there are no events for that week for that individual:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文