【问题标题】:Using dplyr to enumerate redundant values in a data.frame使用 dplyr 枚举 data.frame 中的冗余值
【发布时间】:2018-08-08 22:05:09
【问题描述】:

我有一个data.frame 有两组 ID,这两个 ID 都可能是多余的。

这是一个例子:

df <- data.frame(id1 = c("id.1","id.1","id.1","id.1","id.1","id.2","id.2","id.3"),
                 id2 = c("id.1.a","id.1.b","id.1.a","id.1.c","id.1.b","id.2.a","id.2.b","id.3.a"))

我想要做的是添加另一个 ID 列,其中df$id1 将有一个数字后缀,值增加,遵循df$id2 的顺序。

因此对于上面的示例,生成的 data.frame 将是:

res.df <- data.frame(id1 = c("id.1","id.1","id.1","id.1","id.1","id.2","id.2","id.3"),
                     id2 = c("id.1.a","id.1.b","id.1.a","id.1.c","id.1.b","id.2.a","id.2.b","id.3.a"),
                     id3 = c("id.1.01","id.1.03","id.1.02","id.1.05","id.1.04","id.2.01","id.2.02","id.3"))

所以由于id.1 映射到id.1.a 两次,id.1.b 两次,id.1.c 一次,它变成:id.1.01, id.1.03, id.1.02, id.1.05, id.1.04

知道如何使用dplyrtidyr 解决这个问题吗?

【问题讨论】:

    标签: r dataframe dplyr tidyr


    【解决方案1】:
    1. 我们按id1 对行进行分组,因为这是我们要计算行数的分组。
    2. 我们按id1 后跟id2 排列它们
    3. 我们创建一个新列,将row_number 附加到id1 的末尾。由于行由id1id2 排列,row_number 将保持该顺序

    例子:

    df %>%
        group_by(id1) %>%
        arrange(id1, id2) %>%
        mutate(id3 = paste0(id1, '.', row_number()))
    
    
    # A tibble: 8 x 3
    # Groups:   id1 [3]
      id1   id2    id3   
      <fct> <fct>  <chr> 
    1 id.1  id.1.a id.1.1
    2 id.1  id.1.a id.1.2
    3 id.1  id.1.b id.1.3
    4 id.1  id.1.b id.1.4
    5 id.1  id.1.c id.1.5
    6 id.2  id.2.a id.2.1
    7 id.2  id.2.b id.2.2
    8 id.3  id.3.a id.3.1
    

    【讨论】:

      【解决方案2】:

      我们可以直接在 'id2' 上使用row_number

      library(dplyr)
      df %>%
         group_by(id1) %>% 
         mutate(id3 = paste0(id1, ".", row_number(id2)))
      # A tibble: 8 x 3
      # Groups:   id1 [3]
      #  id1   id2    id3   
      #  <fct> <fct>  <chr> 
      #1 id.1  id.1.a id.1.1
      #2 id.1  id.1.b id.1.3
      #3 id.1  id.1.a id.1.2
      #4 id.1  id.1.c id.1.5
      #5 id.1  id.1.b id.1.4
      #6 id.2  id.2.a id.2.1
      #7 id.2  id.2.b id.2.2
      #8 id.3  id.3.a id.3.1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        相关资源
        最近更新 更多