[英]How can I add a new grouping variable
如何根据日期添加另一个变量作为分组变量? 这是我的数据:
df <- tibble(id = c(rep(1, 8), rep(2, 3)),
col = structure(c(19031, 19031, 19031, 19031, 19072, 19072, 19072, 19072, 19031, 19031,
19031), class = "Date"),
grouping_var = c(rep(1, 4), rep(2,4), rep(1, 3) ) )
列grouping_variable
是我想要的预期结果。 所以基本上,我想根据日期分配一个分组。 如果一个id
在col
中有多个日期,那么第一个日期会被分配一个1
,第二个被分配一个2
,如果一个 id 只有一个日期,它只会被分配一个1
。 dpylr 解决方案在这里特别好。
谢谢
您可以按id
分组,然后将日期列与自身的排序unique
值进行match
。
df %>%
group_by(id) %>%
mutate(grouping_var = match(col, sort(unique(col))))
#> # A tibble: 11 x 3
#> # Groups: id [2]
#> id col grouping_var
#> <dbl> <date> <int>
#> 1 1 2022-02-08 1
#> 2 1 2022-02-08 1
#> 3 1 2022-02-08 1
#> 4 1 2022-02-08 1
#> 5 1 2022-03-21 2
#> 6 1 2022-03-21 2
#> 7 1 2022-03-21 2
#> 8 1 2022-03-21 2
#> 9 2 2022-02-08 1
#> 10 2 2022-02-08 1
#> 11 2 2022-02-08 1
在ave
中使用cumsum(duplicated(.))
。
transform(df, grouping_var2=ave(as.numeric(col), id,
FUN=\(x) cumsum(!duplicated(sort(x)))[order(x)]))
# id col grouping_var
# 1 1 2022-02-08 1
# 2 1 2022-02-08 1
# 3 1 2022-02-08 1
# 4 1 2022-02-08 1
# 5 1 2022-03-21 2
# 6 1 2022-03-21 2
# 7 1 2022-03-21 2
# 8 1 2022-03-21 2
# 9 2 2022-02-08 1
# 10 2 2022-02-08 1
# 11 2 2022-02-08 1
或者按照@GKi
建议使用findInterval
:
transform(df, grouping_var2=ave(as.numeric(col), id,
FUN=\(x) findInterval(x, sort(unique(x)))))
对于dplyr
只需使用mutate
而不是transform
。
您可以在dplyr
中使用dense_rank()
,它是match(x, sort(unique(x)))
的包装器。
df %>%
group_by(id) %>%
mutate(grp_var = dense_rank(col))
# A tibble: 11 x 3
# Groups: id [2]
id col grouping_var
<dbl> <date> <int>
1 1 2022-02-08 1
2 1 2022-02-08 1
3 1 2022-02-08 1
4 1 2022-02-08 1
5 1 2022-03-21 2
6 1 2022-03-21 2
7 1 2022-03-21 2
8 1 2022-03-21 2
9 2 2022-02-08 1
10 2 2022-02-08 1
11 2 2022-02-08 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.