我有一个具体的问题. 我有一个在R中看起来像这样的数据集:

     name   person_id  year municipality_id
   <chr>      <dbl> <dbl>           <dbl>
 1 Brown        654  2000               1
 2 Brown        781  2000               1
 3 James       2531  2000               1
 4 Smith       2187  2000               1
 5 Smith          6  2000               1
 6 White         22  2000              45
 7 Colgan       100  2000              45
 8 Brown      45123  2000              45
 9 Smith         11  2000              45
10 Smith          9  2000              45
11 Brown        654  2004               1
12 Brown       1641  2004               1
13 James       2531  2004               1
14 Smith       2187  2004               1
15 Smith        450  2004               1
16 White         42  2004              45
17 Colgan       100  2004              45
18 Brown      45123  2004              45
19 Smith         11  2004              45
20 Smith      86573  2004              45
21 Brown        654  2008               1
22 Brown       1641  2008               1
23 James       2531  2008               1
24 Smith       2187  2008               1
25 Smith        450  2008               1
26 White         42  2008              45
27 Colgan       100  2008              45
28 Brown      45123  2008              45
29 Smith         11  2008              45
30 Smith      86573  2008              45

我想知道每个城市有多少不同的人在同一年或前一年有相同的名字.

换句话说,我想要创建一个列(n_same),它给出每个组municipality_id中的行数,这些行数在同一年或前几年中具有相同值name,但不同值person_id.然后是一个值为0/1的列,这取决于n_same是否== 0(值为0)或不是(1).

结果基本上是这样的:

      name   person_id  year municipality_id n_same dummy
   <chr>      <dbl> <dbl>           <dbl>  <dbl> <dbl>
 1 Brown        654  2000               1      1     1
 2 Brown        781  2000               1      1     1
 3 James       2531  2000               1      0     0
 4 Smith       2187  2000               1      1     1
 5 Smith          6  2000               1      1     1
 6 White         22  2000              45      0     0
 7 Colgan       100  2000              45      0     0
 8 Brown      45123  2000              45      0     0
 9 Smith         11  2000              45      1     1
10 Smith          9  2000              45      1     1
11 Brown        654  2004               1      2     1
12 Brown       1641  2004               1      2     1
13 James       2531  2004               1      0     0
14 Smith       2187  2004               1      2     1
15 Smith        450  2004               1      2     1
16 White         42  2004              45      1     1
17 Colgan       100  2004              45      0     0
18 Brown      45123  2004              45      0     0
19 Smith         11  2004              45      2     1
20 Smith      86573  2004              45      2     1
21 Brown        654  2008               1      2     1
22 Brown       1641  2008               1      2     1
23 James       2531  2008               1      0     0
24 Smith       2187  2008               1      2     1
25 Smith        450  2008               1      2     1
26 White         42  2008              45      1     1
27 Colgan       100  2008              45      0     0
28 Brown      45123  2008              45      0     0
29 Smith         11  2008              45      2     1
30 Smith      86573  2008              45      2     1

我已经try 了一堆不同的东西在这一点上,不能真正得到它.任何帮助是非常感谢.谢谢!

推荐答案

这对数据进行了分类,以便于判断—它确实要求数据按年份分类,至少在市政集团内是这样.排序后,我们得到每个城市和名称中唯一person_ids的累积计数,然后取n_same比累积计数的最大值少1,将分组值加year.

当然,cum_distinct栏可以删除,我只是留下它,以更好地显示答案如何工作.

df |>
  arrange(municipality_id, name, year, person_id) |>
  mutate(
    cum_distinct = cumsum(!duplicated(person_id)),
    .by = c(municipality_id, name)
  ) |>
  mutate(
    n_same = max(cum_distinct) - 1,
    .by = c(name, year, municipality_id)
  )
#      name person_id year municipality_id cum_distinct n_same
# 1   Brown       654 2000               1            1      1
# 2   Brown       781 2000               1            2      1
# 11  Brown       654 2004               1            2      2
# 12  Brown      1641 2004               1            3      2
# 21  Brown       654 2008               1            3      2
# 22  Brown      1641 2008               1            3      2
# 3   James      2531 2000               1            1      0
# 13  James      2531 2004               1            1      0
# 23  James      2531 2008               1            1      0
# 5   Smith         6 2000               1            1      1
# 4   Smith      2187 2000               1            2      1
# 15  Smith       450 2004               1            3      2
# 14  Smith      2187 2004               1            3      2
# 25  Smith       450 2008               1            3      2
# 24  Smith      2187 2008               1            3      2
# 8   Brown     45123 2000              45            1      0
# 18  Brown     45123 2004              45            1      0
# 28  Brown     45123 2008              45            1      0
# 7  Colgan       100 2000              45            1      0
# 17 Colgan       100 2004              45            1      0
# 27 Colgan       100 2008              45            1      0
# 10  Smith         9 2000              45            1      1
# 9   Smith        11 2000              45            2      1
# 19  Smith        11 2004              45            2      2
# 20  Smith     86573 2004              45            3      2
# 29  Smith        11 2008              45            3      2
# 30  Smith     86573 2008              45            3      2
# 6   White        22 2000              45            1      0
# 16  White        42 2004              45            2      1
# 26  White        42 2008              45            2      1

使用这些数据:

df = read.table(text = '     name   person_id  year municipality_id
 1 Brown        654  2000               1
 2 Brown        781  2000               1
 3 James       2531  2000               1
 4 Smith       2187  2000               1
 5 Smith          6  2000               1
 6 White         22  2000              45
 7 Colgan       100  2000              45
 8 Brown      45123  2000              45
 9 Smith         11  2000              45
10 Smith          9  2000              45
11 Brown        654  2004               1
12 Brown       1641  2004               1
13 James       2531  2004               1
14 Smith       2187  2004               1
15 Smith        450  2004               1
16 White         42  2004              45
17 Colgan       100  2004              45
18 Brown      45123  2004              45
19 Smith         11  2004              45
20 Smith      86573  2004              45
21 Brown        654  2008               1
22 Brown       1641  2008               1
23 James       2531  2008               1
24 Smith       2187  2008               1
25 Smith        450  2008               1
26 White         42  2008              45
27 Colgan       100  2008              45
28 Brown      45123  2008              45
29 Smith         11  2008              45
30 Smith      86573  2008              45', header = T)

R相关问答推荐

按崩溃类别分类的指数

如何在弹性表中为类别值的背景上色

无法在我的情节中表现出显着的差异

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

使用tidyverse方法绑定行并从一组管道列表执行左连接

更改默认系列1以更改名称

给定开始日期和月份(数字),如何根据R中的开始日期和月数创建日期列

R如何计算现有行的总和以添加新的数据行

R中Gamma回归模型均方误差的两种计算方法不一致

如何在反曲线图中更改X标签

`-`是否也用于数据帧,有时使用引用调用?

如何构建一个for循环来循环处理动物ID?

随机 Select 的非NA列的行均数

使用geom_sf跨越日期线时的闭合边界

在生成打印的自定义函数中,可以通过变量将线型或 colored颜色 设置为NULL吗?

计算来自单独分组的分幅的值的百分位数

将每晚的平均值与每晚的值进行比较,统计是否有效?

我怎么才能把一盘棋变成一盘棋呢?

从data.table列表中提取特定组值,并在R中作为向量返回

臭虫?GradeThis::grade_this_code()在`-code-check`块中失败