是否有R函数根据用户提供的矢量来零件数据?

时间:2019-08-15 13:37:11

标签: r group-by dplyr

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、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     

2 个答案:

答案 0 :(得分:3)

我们可以使用 message.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/X-My-Header", "some value") cut中以定义的间隔中断行。

part_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

答案 1 :(得分:1)

一种选择是通过与row_number比较来创建逻辑索引,从而创建分组索引,获取累积总和,然后使用该索引将其更改为LETTERS(内置{{1} })

vector

在这里,part_vector <- c(2, 6) elec.store %>% mutate(grouping = LETTERS[1 + cumsum(row_number() %in% (part_vector + 1))]) # 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 仅用于示例。如果我们有更多的组,则可以轻松创建

LETTERS