在R中按名称和日期添加一个不合法的ID

sam*_*it4 2 r dataframe tidyverse

我正在做一些数据清理/格式化,我想按名称然后按日期为每个记录添加一个唯一的标识符。例如,“鲍勃”可能有四个入住日期,其中两个是相同的。对于这种情况,我想给他三个不同的(顺序的)ID号。

这是我最接近理想结果的位置:


我创建的示例数据集:


tst <- data_frame(
  name = c("Bob", "Sam", "Roger", "Stacy", "Roger", "Roger", "Sam", "Bob", "Sam", "Stacy", "Bob", "Stacy", "Roger", "Bob"),
  date = as.Date(c("2009-07-03", "2010-08-12", "2009-07-03", "2016-04-01", "2002-01-03", "2019-02-10", "2005-04-17", "2009-07-03", "2010-09-21", "2012-11-12", "2015-12-31", "2014-10-10", "2015-06-02", "2003-08-21")),
  amount = round(runif(14, 0, 100), 2)
)

Run Code Online (Sandbox Code Playgroud)

产生check_in_number变数...

tst2 <- tst %>%
  arrange(date) %>%
  group_by(name, date) %>%
  mutate(check_in_number = row_number())

Run Code Online (Sandbox Code Playgroud)

上面的线将产生check_in_number对于鲍勃如1121的顺序。我反而像输出为1223。换一种说法。我希望将同一日期的签到实例视为一次签到。

tidyverse有可能吗?我是否忽略了一个简单的方法?


这里有一个类似的问题,但是我将其遗漏了,因为该问题涉及到我要在上面排列数据的有序日期变量。换句话说,我的数据要求我的新变量必须连续。

如何从group_by中按组号对数据表进行编号/标签?

Cal*_*You 5

您需要group_indices

library(tidyverse)

tst <- tibble(
  name = c("Bob", "Sam", "Roger", "Stacy", "Roger", "Roger", "Sam", "Bob", "Sam", "Stacy", "Bob", "Stacy", "Roger", "Bob"),
  date = as.Date(c("2009-07-03", "2010-08-12", "2009-07-03", "2016-04-01", "2002-01-03", "2019-02-10", "2005-04-17", "2009-07-03", "2010-09-21", "2012-11-12", "2015-12-31", "2014-10-10", "2015-06-02", "2003-08-21")),
  amount = round(runif(14, 0, 100), 2)
)

tst %>%
  arrange(name, date) %>%
  mutate(check_in_number = group_indices(., name, date))
#> # A tibble: 14 x 4
#>    name  date       amount check_in_number
#>    <chr> <date>      <dbl>           <int>
#>  1 Bob   2003-08-21  91.1                1
#>  2 Bob   2009-07-03  38.1                2
#>  3 Bob   2009-07-03  28.3                2
#>  4 Bob   2015-12-31  22.3                3
#>  5 Roger 2002-01-03  68.3                4
#>  6 Roger 2009-07-03  83.8                5
#>  7 Roger 2015-06-02  94.2                6
#>  8 Roger 2019-02-10  48.8                7
#>  9 Sam   2005-04-17  16.6                8
#> 10 Sam   2010-08-12  93.2                9
#> 11 Sam   2010-09-21  65.5               10
#> 12 Stacy 2012-11-12  92.6               11
#> 13 Stacy 2014-10-10  84.4               12
#> 14 Stacy 2016-04-01   7.43              13
Run Code Online (Sandbox Code Playgroud)

如果需要重新编号每个名称,则可以根据每个名称中的第一个值重新缩放:

tst %>%
  arrange(name, date) %>%
  mutate(check_in_number = group_indices(., name, date)) %>%
  group_by(name) %>%
  mutate(check_in_number = check_in_number - first(check_in_number) + 1)
#> # A tibble: 14 x 4
#> # Groups:   name [4]
#>    name  date       amount check_in_number
#>    <chr> <date>      <dbl>           <dbl>
#>  1 Bob   2003-08-21  91.1                1
#>  2 Bob   2009-07-03  38.1                2
#>  3 Bob   2009-07-03  28.3                2
#>  4 Bob   2015-12-31  22.3                3
#>  5 Roger 2002-01-03  68.3                1
#>  6 Roger 2009-07-03  83.8                2
#>  7 Roger 2015-06-02  94.2                3
#>  8 Roger 2019-02-10  48.8                4
#>  9 Sam   2005-04-17  16.6                1
#> 10 Sam   2010-08-12  93.2                2
#> 11 Sam   2010-09-21  65.5                3
#> 12 Stacy 2012-11-12  92.6                1
#> 13 Stacy 2014-10-10  84.4                2
#> 14 Stacy 2016-04-01   7.43               3
Run Code Online (Sandbox Code Playgroud)

reprex软件包(v0.3.0)创建于2019-06-18

  • 凉。我不知道`group_indices` (2认同)