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对于鲍勃如1,1,2,1的顺序。我反而像输出为1,2,2,3。换一种说法。我希望将同一日期的签到实例视为一次签到。
tidyverse有可能吗?我是否忽略了一个简单的方法?
这里有一个类似的问题,但是我将其遗漏了,因为该问题涉及到我要在上面排列数据的有序日期变量。换句话说,我的数据要求我的新变量必须连续。
您需要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