【问题标题】:Assign a name for each unique value in another column为另一列中的每个唯一值分配一个名称
【发布时间】:2021-06-12 12:30:00
【问题描述】:

我在 df 中有 C1,我想根据 C1 中的每个唯一值获取一个新列 C2,它有一个 ID。
但我想为 C2 (Group) 指定一个特定的名称,后跟一个数字,从 01 开始计数,而不是 1,因为我将拥有多达 13 个组并希望将它们正确分组。 我还想为最后一个唯一值 (Z) 保留相同的名称,以便 C2 看起来像这样:

   C1    C2     
   <chr> <chr>  
 1 A     Group01
 2 A     Group01
 3 A     Group01
 4 A     Group01
 5 B     Group02
 6 B     Group02
 7 B     Group02
 8 B     Group02
 9 C     Group03
10 C     Group03
11 C     Group03
12 C     Group03
13 Z     Z      
14 Z     Z      
15 Z     Z      
16 Z     Z 

我试图获取 id,例如 df &lt;- transform(df,id=as.numeric(factor(C1))) 但我明白了。

   C1      C2 id
1   A Group01  1
2   A Group01  1
3   A Group01  1
4   A Group01  1
5   B Group02  2
6   B Group02  2
7   B Group02  2
8   B Group02  2
9   C Group03  3
10  C Group03  3
11  C Group03  3
12  C Group03  3
13  Z       Z  4
14  Z       Z  4
15  Z       Z  4
16  Z       Z  4 

我想我可以使用“Group”参数创建一个新列,但我不知道如何获取从 01 开始的 id。

【问题讨论】:

    标签: r unique assign


    【解决方案1】:

    您可以使用match + unique 为每个C1 值获取一个唯一编号,保持该值与C1 相同,以获得组中的最后一个值。使用sprintf 获取值为01。

    library(dplyr)
    
    df <- df %>%
            mutate(tmp = match(C1, unique(C1)), 
                   C2 = replace(sprintf('Group%02d', tmp), C1 == 'Z', 'Z')) %>%
            select(-tmp)
    df
    
    #   C1      C2
    #1   A Group01
    #2   A Group01
    #3   A Group01
    #4   A Group01
    #5   B Group02
    #6   B Group02
    #7   B Group02
    #8   B Group02
    #9   C Group03
    #10  C Group03
    #11  C Group03
    #12  C Group03
    #13  Z       Z
    #14  Z       Z
    #15  Z       Z
    #16  Z       Z
    

    数据

    df <- structure(list(C1 = c("A", "A", "A", "A", "B", "B", "B", "B", 
    "C", "C", "C", "C", "Z", "Z", "Z", "Z")), row.names = c(NA, -16L
    ), class = "data.frame")
    

    【讨论】:

    • 它似乎可以工作,但不会删除 tmp 列。在 C2 中保持 Z 为 Z 的代码部分是什么?
    • 1.您需要将数据分配回原始df,即df &lt;- df %&gt;%mutate(....。 2. ifelse(tmp == max(tmp), C1...) 保持 Z 为 Z,因为 Z 将具有 max tmp 值。
    • 1.是的,我试过了,但没有成功。有任何想法吗?我做到了df &lt;- subset(df, select = -c(tmp)) 并工作了。 2. 好的。您能否展示一个替代方案,以便在 C1 中读取 Z 时将 Z 保留在 C2 中?
    • 我认为您想保留数据中存在的任何最后一个唯一值。如果您想特别保留“Z”值,我已经更新了答案。
    • 是的,这是一个额外的问题。我有时在 C1 行中包含 Z(例如 Z 或 Z_samples 等),所以每当在 C1 中找到名称中的 Z 时,我想在 C2 中保持相同的名称。我想过哪个函数 ``` A tibble: 20 x 1 C1 1 A 2 A 3 A 4 A 5 B 6 B 7 B 8 B 9 C 10 C 11 C 12 C 13 Z 14 Z 15 Z 16 Z 17 个 Z_samples 18 个 Z_samples 19 个 Z_samples 20 个 Z_samples ```
    【解决方案2】:

    EDIT在这种情况下,您可以使用 if_else 语句

    df <- data.frame(C1 = c(rep(LETTERS[1:7], each = 4), rep("Z", 4)))
    df
    
    
    df %>% mutate(C2 = if_else(C1 == "Z", C1, paste0("Group", str_pad(dense_rank(C1), width = 2, side = "left", pad = "0"))))
    
       C1      C2
    1   A Group01
    2   A Group01
    3   A Group01
    4   A Group01
    5   B Group02
    6   B Group02
    7   B Group02
    8   B Group02
    9   C Group03
    10  C Group03
    11  C Group03
    12  C Group03
    13  D Group04
    14  D Group04
    15  D Group04
    16  D Group04
    17  E Group05
    18  E Group05
    19  E Group05
    20  E Group05
    21  F Group06
    22  F Group06
    23  F Group06
    24  F Group06
    25  G Group07
    26  G Group07
    27  G Group07
    28  G Group07
    29  Z       Z
    30  Z       Z
    31  Z       Z
    32  Z       Z
    

    如果最后一个值未知,则为或

    df %>% mutate(d = dense_rank(C1),
                  C2 = if_else(d == max(d), C1, paste0("Group", str_pad(d, width = 2, side = "left", pad = "0")))) %>%
      select(-d)
    
       C1      C2
    1   A Group01
    2   A Group01
    3   A Group01
    4   A Group01
    5   B Group02
    6   B Group02
    7   B Group02
    8   B Group02
    9   C Group03
    10  C Group03
    11  C Group03
    12  C Group03
    13  D Group04
    14  D Group04
    15  D Group04
    16  D Group04
    17  E Group05
    18  E Group05
    19  E Group05
    20  E Group05
    21  F Group06
    22  F Group06
    23  F Group06
    24  F Group06
    25  G Group07
    26  G Group07
    27  G Group07
    28  G Group07
    29  Z       Z
    30  Z       Z
    31  Z       Z
    32  Z       Z
    

    【讨论】:

    • 我收到此错误:错误:cur_group_id() 只能在 dplyr 动词中使用。
    • 这行得通,谢谢。但是它将 Z 命名为 Group+number,当 C1 中存在“Z”时,我需要它来保留它而不给它分配另一个名称
    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多