【问题标题】:Create group names for consecutive values为连续值创建组名
【发布时间】:2016-10-15 00:19:47
【问题描述】:

看起来很简单,想不出更简单的方法。我在下面有一个x 向量,需要为连续值创建组名。我的尝试是使用rle,有更好的想法吗?

# data
x <- c(1,1,1,2,2,2,3,2,2,1,1)

# make groups
rep(paste0("Group_", 1:length(rle(x)$lengths)), rle(x)$lengths)
# [1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4"
# [9] "Group_4" "Group_5" "Group_5"

【问题讨论】:

  • 为什么不直接使用粘贴?paste0('groupe_', c(1,1,1,2,2,2,3,2,2,1,1))
  • 因为如果直接粘贴最后两组将是2和1而不是4和5
  • @MamounBenghezal 请检查预期输出,首先1Group_1,最后1Group_5
  • 不错的尝试。 rle 源代码中的一个关键行使用了diff,正如@Roland 在下面所做的那样。
  • @CarlWitthoft 名称与值的顺序相同,因此直接映射,即:names(x) &lt;- myGroups。我的实际数据是 data.frame,所以我可以应用相同的数据并为聚合函数创建一个 Group 列。

标签: r run-length-encoding


【解决方案1】:

使用来自data.tablerleid

library(data.table)

rleid(x, prefix = "Group_")
#[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"

【讨论】:

    【解决方案2】:

    使用diffcumsum

    paste0("Group_", cumsum(c(1, diff(x) != 0)))
    #[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"
    

    (如果您的值是浮点值,您可能必须避免使用!= 并改用容差。)

    【讨论】:

    • 如果它们可能不是数字 - paste0("Group_", cumsum(c(TRUE, head(x,-1)!=tail(x,-1))))
    • 我的数字没有浮点数,所以!=应该没问题,但是你说的容差是什么意思?
    • abs(diff(x)) &lt; toltol 基于 help(".Machine")
    • 很好 - 我猜这比 rle(x) 更快并处理输出。 OTOH,我想知道如何将组名映射到运行,在这种情况下不妨使用rle(x)$lengths
    【解决方案3】:

    使用 cumsum 但不依赖于数字数据:

    paste0("Group_", 1 + c(0, cumsum(x[-length(x)] != x[-1])))
    
    
    [1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"
    

    【讨论】:

      【解决方案4】:

      group() from groupdata2 可以使用l_starts 方法从组起点列表创建组。通过将n设置为auto,它会自动查找组开始:

      x <- c(1,1,1,2,2,2,3,2,2,1,1)
      groupdata2::group(x, n = "auto", method = "l_starts")
      
      ## # A tibble: 11 x 2
      ## # Groups:   .groups [5]
      ##     data .groups
      ##    <dbl> <fct>  
      ##  1     1 1      
      ##  2     1 1      
      ##  3     1 1      
      ##  4     2 2      
      ##  5     2 2      
      ##  6     2 2      
      ##  7     3 3      
      ##  8     2 4      
      ##  9     2 4      
      ## 10     1 5      
      ## 11     1 5     
      

      还有一个 differs_from_previous() 函数可以查找与前一个值相差某个阈值的值或值的索引。

      # The values to start groups at
      differs_from_previous(x, threshold = 1,
                            direction = "both")
      ## [1] 2 3 2 1
      
      # The indices to start groups at
      differs_from_previous(x, threshold = 1,
                            direction = "both",
                            return_index = TRUE)
      ## [1] 4 7 8 10
      

      【讨论】:

        猜你喜欢
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 2012-04-26
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多