使用有序数字代码创建新变量

问题描述 投票:0回答:1

我有以下数据集:

group   id  date
G1      A   12/10/2007
G1      A   13/10/2007
G1      A   14/10/2007
G1      B   15/10/2007
G1      B   16/10/2007
G1      A   17/10/2007
G2      A   25/10/2007
G2      A   26/10/2007
G2      C   27/10/2007
G2      B   28/10/2007
G2      B   29/10/2007
G2      A   30/10/2007

我想添加一个新列,按组将 ID 转换为数字、有序形式(从 1 开始)。订单应按日期(在本例中,已订购)。输出将如下所示:

group   id  date        id_new
G1      A   12/10/2007  1
G1      A   13/10/2007  1
G1      A   14/10/2007  1
G1      B   15/10/2007  2
G1      B   16/10/2007  2
G1      A   17/10/2007  1
G2      A   25/10/2007  1
G2      A   26/10/2007  1
G2      C   27/10/2007  2
G2      B   28/10/2007  3
G2      B   29/10/2007  3
G2      A   30/10/2007  1

所以,个体A(或另一个)在一个组中是“1”,在另一个组中是“2”是可以的;我只需要按首次到达(日期)编码

id_new
。我想这可以用
dplyr
来完成,但不确定如何......?我肯定会使用
group_by(group)
,但不确定之后使用哪个函数。

用于重现示例的数据集:

structure(c("G1", "G1", "G1", "G1", "G1", "G1", "G2", "G2", "G2", 
"G2", "G2", "G2", "A", "A", "A", "B", "B", "A", "A", "A", "C", 
"B", "B", "A", "12/10/2007", "13/10/2007", "14/10/2007", "15/10/2007", 
"16/10/2007", "17/10/2007", "25/10/2007", "26/10/2007", "27/10/2007", 
"28/10/2007", "29/10/2007", "30/10/2007", "1", "1", "1", "2", 
"2", "1", "1", "1", "2", "3", "3", "1"), dim = c(12L, 4L), dimnames = list(
    NULL, c("group", "id", "date", "id_new")))
r dataframe dplyr
1个回答
0
投票

您可以使用

forecats
包将
id
转换为因子,然后转换为整数。

df %>%
  group_by(group) %>%
  mutate(id_new = as.integer(forecats::fct_inorder(as.factor(id))))

# A tibble: 12 × 4
# Groups:   group [2]
   group id    date       id_new
   <chr> <chr> <chr>       <int>
 1 G1    A     12/10/2007      1
 2 G1    A     13/10/2007      1
 3 G1    A     14/10/2007      1
 4 G1    B     15/10/2007      2
 5 G1    B     16/10/2007      2
 6 G1    A     17/10/2007      1
 7 G2    A     25/10/2007      1
 8 G2    A     26/10/2007      1
 9 G2    C     27/10/2007      2
10 G2    B     28/10/2007      3
11 G2    B     29/10/2007      3
12 G2    A     30/10/2007      1
© www.soinside.com 2019 - 2024. All rights reserved.