首页 > 解决方案 > 是否有基于用户提供的向量来分割数据的 R 函数?

问题描述

library(tidyverse)
elec.store <- tibble(computer = c(rep("Dell", 3), rep("HP", 3), rep("Lenovo", 3)),
                sold = c(6, 2, 3, 8, 7, 5, 1, 1, 9))
#> # A tibble: 9 x 2
#>   computer  sold
#>   <chr>    <dbl>
#> 1 Dell         6
#> 2 Dell         2
#> 3 Dell         3
#> 4 HP           8
#> 5 HP           7
#> 6 HP           5
#> 7 Lenovo       1
#> 8 Lenovo       1
#> 9 Lenovo       9

假设我有我的电子商店数据框,如上所示。我想要某种看起来像这样的函数,parting_function(elec.store, c(2, 6))它会改变一个新列,基本上将我的数据分组到任意组中(如下所示,在这种情况下,我选择了字母,但可以是任何东西)。该部分在第 2 行和第 6 行之后,如果不明显。

是否存在这样的“分离”功能,如果不存在,我将如何编写该功能?这就是我希望它做的事情,而不必手动选择要重复的字母和数量(例如 2、4、3,如下图所示):

elec.store %>% mutate(grouping = c(rep("A", 2), rep("B", 4), rep("C", 3)))
# A tibble: 9 x 3
#>   computer  sold grouping
#>   <chr>    <dbl> <chr>   
#> 1 Dell         6 A       
#> 2 Dell         2 A       
#> 3 Dell         3 B       
#> 4 HP           8 B       
#> 5 HP           7 B       
#> 6 HP           5 B       
#> 7 Lenovo       1 C       
#> 8 Lenovo       1 C       
#> 9 Lenovo       9 C     

标签: rgroup-bydplyr

解决方案


我们可以使用cutpart_vector.

part_vector <- c(2, 6)
elec.store$grouping <- cut(seq_len(nrow(elec.store)),
                        breaks = c(-Inf, part_vector, Inf), 
                        labels = LETTERS[seq_len(length(part_vector) + 1)])



# A tibble: 9 x 3
#  computer  sold grouping
#  <chr>    <dbl> <fct>   
#1 Dell         6 A       
#2 Dell         2 A       
#3 Dell         3 B       
#4 HP           8 B       
#5 HP           7 B       
#6 HP           5 B       
#7 Lenovo       1 C       
#8 Lenovo       1 C       
#9 Lenovo       9 C    

如果您想将其安装在dplyr管道中。

library(dplyr)
elec.store %>%
  mutate(grouping = cut(seq_len(n()), 
                     breaks = c(-Inf, part_vector, Inf), 
                     labels = LETTERS[seq_len(length(part_vector) + 1)]))

您也可以使用重新创建相同的findInterval

elec.store$grouping <- LETTERS[findInterval(seq_len(nrow(elec.store)),
                       part_vector, left.open = TRUE) + 1]

推荐阅读