r语言 - 如何创建具有按 ID 和年份编号的实例的列



我正在尝试找到一种方法在我的数据帧中创建一列,该列将列出personID和财政年度的每个唯一组合的出现次数。

我有一个数据帧设置了如下变量:

Person.Id   Reported.Fiscal.Year  
250           2017
250           2017
250           2018
300           2018
511           2019
300           2018
700           2017

因此,在此示例中,我想在上面的 df 中创建一列,该列具有类似于"year"的内容,该列将列出 id 250 和 2017 年的第 1 年,但对于 id 250 和财政年度,将列出第 2 年 250 和财政年度 2018。这样:

Person.Id   Reported.Fiscal.Year    year
250           2017                   1
250           2017                   1
250           2018                   2
300           2018                   1
511           2019                   1
300           2018                   1
700           2017                   1

我尝试了以下代码:

df1 <- df1 %>% arrange(Person.Id,Reported.Fiscal.Year)
df2<- df1 %>% group_by(Person.Id,Reported.Fiscal.Year) %>% mutate(year=row_number())

但这会产生如下所示的数据框(基本上按 ID 计算每年的发生次数(:

Person.Id   Reported.Fiscal.Year    year
250           2017                   1
250           2017                   2
250           2018                   1
300           2018                   1
511           2019                   1
300           2018                   2
700           2017                   1

这是@Petr&@Bruno非常好的基于join的解决方案的替代方案。这个通过为每个人建立唯一年份的累积计数来工作。

library(readr)
df <- read_table("Person.Id   Reported.Fiscal.Year  
250           2017
250           2017
250           2018
300           2018
511           2019
300           2018
700           2017")
library(dplyr)
df %>%
arrange(Person.Id, Reported.Fiscal.Year) %>%
group_by(Person.Id) %>%
mutate(year = cumsum(!duplicated(Reported.Fiscal.Year)))
#> # A tibble: 7 x 3
#> # Groups:   Person.Id [4]
#>   Person.Id Reported.Fiscal.Year  year
#>       <dbl>                <dbl> <int>
#> 1       250                 2017     1
#> 2       250                 2017     1
#> 3       250                 2018     2
#> 4       300                 2018     1
#> 5       300                 2018     1
#> 6       511                 2019     1
#> 7       700                 2017     1

创建于 2020-07-06 由 reprex 软件包 (v0.3.0(

欢迎来到 SO!

之前不得不总结您的数据,也许有人可以提供更简单的解决方案

library(tidyverse)
df_example <- read_table("Person.Id   Reported.Fiscal.Year  
250           2017
250           2017
250           2018
300           2018
511           2019
300           2018
700           2017")

df_example_summary <- df_example %>% 
group_by(Person.Id,Reported.Fiscal.Year) %>% 
summarise(number_reports = n(),,.groups = "drop_last") %>% 
mutate(Year = row_number()) %>% 
ungroup()
df_example %>% 
left_join(df_example_summary)
#> Joining, by = c("Person.Id", "Reported.Fiscal.Year")
#> # A tibble: 7 x 4
#>   Person.Id Reported.Fiscal.Year number_reports  Year
#>       <dbl>                <dbl>          <int> <int>
#> 1       250                 2017              2     1
#> 2       250                 2017              2     1
#> 3       250                 2018              1     2
#> 4       300                 2018              2     1
#> 5       511                 2019              1     1
#> 6       300                 2018              2     1
#> 7       700                 2017              1     1

创建于 2020-07-06 由 reprex 软件包 (v0.3.0(

如果我理解正确,您想了解多年来ID的出现吗?

我用过你的代码片段,你很接近。只有您需要选择不同的行来计算出现次数:

  • arrange()两列
  • group_by()ID 以计算每个 ID 的会计年度,
  • 选择distinct()行,即 ID 和会计年度的唯一组合,
  • mutate()和你一样row_number()
  • 并将其连接到原始数据集。

请参阅代码中的注释:

library(dplyr)
# your example data
df <- read.table(header = TRUE, text = "
Person.Id   Reported.Fiscal.Year  
250           2017
250           2017
250           2018
300           2018
511           2019
300           2018
700           2017
")
# 1. arrange by ids and years (this is what you did)
# 2. group by ids to be able to count different fiscal years
# 3. choose only unique combinations of ids and fiscal years
# 4. use row numbers (as you did)
# 5. merge new column to original data
df %>%
arrange(Person.Id, Reported.Fiscal.Year) %>%
group_by(Person.Id) %>%
distinct() %>%
mutate(year = row_number()) %>%
inner_join(df, .)
#> Joining, by = c("Person.Id", "Reported.Fiscal.Year")
#>   Person.Id Reported.Fiscal.Year year
#> 1       250                 2017    1
#> 2       250                 2017    1
#> 3       250                 2018    2
#> 4       300                 2018    1
#> 5       511                 2019    1
#> 6       300                 2018    1
#> 7       700                 2017    1

创建于 2020-07-06 由 reprex 软件包 (v0.3.0(

最新更新