【问题标题】:Sequence with repeating numbers [duplicate]带有重复数字的序列[重复]
【发布时间】:2019-06-17 17:26:51
【问题描述】:

数据

我有一个data.frame,看起来像这样:

df <- data.frame(id = c(1:10),
                 color = c(rep("red", 5), rep("blue", 5)))
df
#>    id color
#> 1   1   red
#> 2   2   red
#> 3   3   red
#> 4   4   red
#> 5   5   red
#> 6   6  blue
#> 7   7  blue
#> 8   8  blue
#> 9   9  blue
#> 10 10  blue

预期结果

我正在尝试创建一个新列,例如 pair,它将一对 ID 分配给每组 2 个连续 ID。例如,我想以 data.frame 结尾,如下所示:

df
#>    id color pair
#> 1   1   red    1
#> 2   2   red    1
#> 3   3   red    2
#> 4   4   red    2
#> 5   5   red    3
#> 6   6  blue    3
#> 7   7  blue    4
#> 8   8  blue    4
#> 9   9  blue    5
#> 10 10  blue    5

当前方法

我想知道的是,是否有比我已经在做的更简洁的方法来实现这一点。不过,我已经浏览了seq() 文档,但没有任何运气。这是我目前所拥有的,它给了我想要的输出,但不是很简洁。

df %>% 
  dplyr::mutate(pair = sort(rep(seq(length.out = nrow(df)/2),2)))

#     id  color   pair
# 1   1   red    1
# 2   2   red    1
# 3   3   red    2
# 4   4   red    2
# 5   5   red    3
# 6   6  blue    3
# 7   7  blue    4
# 8   8  blue    4
# 9   9  blue    5
# 10 10  blue    5

除了seq()之外,有没有人有任何想法或其他功能可以完成这项工作?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个简单的 rep() 来自 base R -

    df$pair <- rep(1:nrow(df), each = 2, length.out = nrow(df))
    
    df
    
       id color pair
    1   1   red    1
    2   2   red    1
    3   3   red    2
    4   4   red    2
    5   5   red    3
    6   6  blue    3
    7   7  blue    4
    8   8  blue    4
    9   9  blue    5
    10 10  blue    5
    

    dplyr -

    df %>% 
      mutate(pair = rep(1:nrow(.), each = 2, length.out = nrow(.)))
    

    【讨论】:

      【解决方案2】:

      另一种选择

      library(dplyr)
      df %>%
         mutate(pair = as.integer(gl(n(), 2, n())))
      #    id color pair
      #1   1   red    1
      #2   2   red    1
      #3   3   red    2
      #4   4   red    2
      #5   5   red    3
      #6   6  blue    3
      #7   7  blue    4
      #8   8  blue    4
      #9   9  blue    5
      #10 10  blue    5
      

      或者repcumsum

      df %>% 
          mutate(pair = cumsum(rep(c(TRUE, FALSE), length.out = n())))
      

      base R 的情况更简单

      df$pair <- c(TRUE, FALSE)
      df$pair <- cumsum(df$pair)
      

      【讨论】:

      • 非常感谢您提供的众多解决方案!我已经记下了它们以备将来使用。
      【解决方案3】:

      一种可能是:

      df %>%
       mutate(pair = gl(n()/2, 2))
      
         id color pair
      1   1   red    1
      2   2   red    1
      3   3   red    2
      4   4   red    2
      5   5   red    3
      6   6  blue    3
      7   7  blue    4
      8   8  blue    4
      9   9  blue    5
      10 10  blue    5
      

      【讨论】:

        【解决方案4】:

        我们可以使用整数除法,

        (df$pair <- (1:nrow(df) - 1) %/% 2)
        #  [1] 0 0 1 1 2 2 3 3 4 4
        

        这也很好地推广到更大的群体;例如,

        (df$pair <- (1:nrow(df) - 1) %/% 3)
        #  [1] 0 0 0 1 1 1 2 2 2 3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-04
          • 2017-11-17
          相关资源
          最近更新 更多