R:如何从列中提取因子水平作为数字并使用 tydyverse 将其分配给新列?

R : How to extract the factor levels as numeric from a column and assign it to a new column using tydyverse?

假设我有一个数据框,df

df = data.frame(name = rep(c("A", "B", "C"), each = 4))

我想得到一个新的dataframe,多了一个名为Group的列,其中Group元素是name对应层级的数值,如图df2.

我知道 case_when 可以做到。我的问题是我的真实数据框非常复杂,name 列有很多级别。懒得一一列举了。

是否有更简单、更智能的方法?

谢谢。

df2
   name Group
1     A     1
2     A     1
3     A     1
4     A     1
5     B     2
6     B     2
7     B     2
8     B     2
9     C     3
10    C     3
11    C     3
12    C     3

tidyverse

中有几种方法可以做到
library(tidyverse)

df %>% group_by(name) %>% mutate(Group = cur_group_id())

df %>% mutate(Group = as.numeric(as.factor(name)))

输出

  name Group
1     A  1
2     A  1
3     A  1
4     A  1
5     B  2
6     B  2
7     B  2
8     B  2
9     C  3
10    C  3
11    C  3
12    C  3

其他几个简单的解决方案:

library(dplyr)

df %>%
  mutate(Group = match(name, unique(name)))
#>    name Group
#> 1     A     1
#> 2     A     1
#> 3     A     1
#> 4     A     1
#> 5     B     2
#> 6     B     2
#> 7     B     2
#> 8     B     2
#> 9     C     3
#> 10    C     3
#> 11    C     3
#> 12    C     3

df %>%
  mutate(Group = cumsum(name != lag(name, default = "")))
#>    name Group
#> 1     A     1
#> 2     A     1
#> 3     A     1
#> 4     A     1
#> 5     B     2
#> 6     B     2
#> 7     B     2
#> 8     B     2
#> 9     C     3
#> 10    C     3
#> 11    C     3
#> 12    C     3

data.table

df = data.frame(name = rep(c("A", "B", "C"), each = 4))

library(data.table)
setDT(df)[, grp := .GRP, by = name][]
#>     name grp
#>  1:    A   1
#>  2:    A   1
#>  3:    A   1
#>  4:    A   1
#>  5:    B   2
#>  6:    B   2
#>  7:    B   2
#>  8:    B   2
#>  9:    C   3
#> 10:    C   3
#> 11:    C   3
#> 12:    C   3

reprex package (v2.0.1)

创建于 2022-02-10