按组查找滚动周期内的计数或频率

发布于 2025-01-19 15:12:47 字数 960 浏览 5 评论 0原文

这是我的数据:

Person<-c("Bob","Bob","Bob","Bob","Mary","Mary","Mary","Mary","Sue","Sue","Sue","Sue")
Year<-c(1980,1981,1982,1983,1980,1981,1982,1983,1980,1981,1982,1983)
Attendance<-c(1,1,0,0,1,1,1,0,0,0,1,0)
data<-as.data.frame(cbind(Person,Year,Attendance))
data

 Person Year Attendance
    Bob 1980          1
    Bob 1981          1
    Bob 1982          0
    Bob 1983          0
    Mary 1980         1
    Mary 1981         1
    Mary 1982         1
    Mary 1983         0
    Sue 1980          0
    Sue 1981          0
    Sue 1982          1
    Sue 1983          0

我想使用Tidyverse/dplyr创建一个表,该表显示了每个人在两年期间的出勤率。像这样:


Person  Two_year_period Frequency_attendance
Bob     1980-1981   100%
Bob     1981-1982   50%
Bob     1982-1983   0%
Mary    1980-1981   100%
Mary    1981-1982   100%
Mary    1982-1983   50%
Sue     1980-1981   0%
Sue     1981-1982   50%
Sue     1982-1983   50%


Here's my data:

Person<-c("Bob","Bob","Bob","Bob","Mary","Mary","Mary","Mary","Sue","Sue","Sue","Sue")
Year<-c(1980,1981,1982,1983,1980,1981,1982,1983,1980,1981,1982,1983)
Attendance<-c(1,1,0,0,1,1,1,0,0,0,1,0)
data<-as.data.frame(cbind(Person,Year,Attendance))
data

 Person Year Attendance
    Bob 1980          1
    Bob 1981          1
    Bob 1982          0
    Bob 1983          0
    Mary 1980         1
    Mary 1981         1
    Mary 1982         1
    Mary 1983         0
    Sue 1980          0
    Sue 1981          0
    Sue 1982          1
    Sue 1983          0

I would like to create a table using tidyverse/dplyr that shows the frequency of attendance for each person over rolling two-year periods. Like this:


Person  Two_year_period Frequency_attendance
Bob     1980-1981   100%
Bob     1981-1982   50%
Bob     1982-1983   0%
Mary    1980-1981   100%
Mary    1981-1982   100%
Mary    1982-1983   50%
Sue     1980-1981   0%
Sue     1981-1982   50%
Sue     1982-1983   50%


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

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

发布评论

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

评论(1

北方。的韩爷 2025-01-26 15:12:48

这是使用dplyr的解决方案:

data_final <- data %>% 
  group_by(Person) %>%
  mutate(Two_year_period  = paste(Year,lead(as.numeric(Year)), sep = "-")) %>% # Create new column with lead year name
  mutate(Attendance2 = lead(as.numeric(Attendance))) %>% # Create new column with lead attendance value
  drop_na(Attendance2) %>% # Drop NA
  mutate(Frequency_attendance = paste((as.double(Attendance) + as.double(Attendance2))*(100/2), "%")) %>% # Calculate Frequency_attendance
  select(-one_of(c('Year', 'Attendance', 'Attendance2'))) #Drop auxiliary columns
data_final

  Person Two_year_period Frequency_attendance
  <chr>  <chr>           <chr>               
1 Bob    1980-1981       100 %               
2 Bob    1981-1982       50 %                
3 Bob    1982-1983       0 %                 
4 Mary   1980-1981       100 %               
5 Mary   1981-1982       100 %               
6 Mary   1982-1983       50 %                
7 Sue    1980-1981       0 %                 
8 Sue    1981-1982       50 %                
9 Sue    1982-1983       50 %     

Here's a solution using dplyr:

data_final <- data %>% 
  group_by(Person) %>%
  mutate(Two_year_period  = paste(Year,lead(as.numeric(Year)), sep = "-")) %>% # Create new column with lead year name
  mutate(Attendance2 = lead(as.numeric(Attendance))) %>% # Create new column with lead attendance value
  drop_na(Attendance2) %>% # Drop NA
  mutate(Frequency_attendance = paste((as.double(Attendance) + as.double(Attendance2))*(100/2), "%")) %>% # Calculate Frequency_attendance
  select(-one_of(c('Year', 'Attendance', 'Attendance2'))) #Drop auxiliary columns
data_final

  Person Two_year_period Frequency_attendance
  <chr>  <chr>           <chr>               
1 Bob    1980-1981       100 %               
2 Bob    1981-1982       50 %                
3 Bob    1982-1983       0 %                 
4 Mary   1980-1981       100 %               
5 Mary   1981-1982       100 %               
6 Mary   1982-1983       50 %                
7 Sue    1980-1981       0 %                 
8 Sue    1981-1982       50 %                
9 Sue    1982-1983       50 %     
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文