r - 是否有基于用户提供的向量来分割数据的 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
解决方案
我们可以使用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
elec.store$grouping <- LETTERS[findInterval(seq_len(nrow(elec.store)),
part_vector, left.open = TRUE) + 1]
推荐阅读
- python - 在 Python 3 中,我们如何模拟对对象属性的引用,使其使用尽可能简单和透明?
- python - Cron 没有运行存储在桌面上的 shell 程序
- javascript - JavaScript在递归函数中返回未定义而不是值
- css - 如何修复 ionic 4 和 css 中存在问题的进度条类?
- javascript - js 日期时间正则表达式
- identityserver4 - 如何使用授权码流 + PKCE 从 IdentityServer 获取用户信息?
- javascript - Visual Studio Code - 编码初学者
- templates - 将 Journal Theme 3.x 中使用的主页背景图像替换为 Opencart 2.x?
- r - CVX 的 DCP for R 遇到问题
- javascript - 在节点 js 中建立 ssh 连接时,为什么后面的代码在建立 ssh 连接之前执行