我正在尝试找到一种方法在我的数据帧中创建一列,该列将列出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(