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
假设我有一个数据框,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