繁体   English   中英

如何添加新的分组变量

[英]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是我想要的预期结果。 所以基本上,我想根据日期分配一个分组。 如果一个idcol中有多个日期,那么第一个日期会被分配一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM