首页 > 解决方案 > 如何快速分组大量元素

问题描述

我在这里创建了一些“数据”作为示例。它包含 100 个元素,每个元素以一个字母开头,后跟 3 个随机数。

我想知道将它们转换为组的最佳/最快方法,就像我在 for 循环中开始做的那样。

假设我需要创建 50 个组,而不是“数据”中的 100 个元素,而是有一百万个。

分组本身将是相当随机的。在我的示例中,我使用 A000-A599 和 A600-A999 作为前 2 个分组,但是这些分组的间隔并不整齐,例如 B000-B599 和 B600-B999 不一定是下一个分组。例如,下一个分组可能是 B000-C299、C300-C799、C800-D499 等。我需要手动输入这些分组。

我猜测 for 循环不是最好的方法,因为它需要很长时间才能完成循环。

library(stringr)
library(magicfor)

data <- paste(sample(LETTERS, 100, replace = T),
    sample(str_pad(000:999, width = 3, side = "left", pad = "0"), 100, replace = T), sep = "")

magic_for()

for(x in seq_along(data)){

 if( grepl("A[0-5]", data[1])){
range <- "A000-A599"
}elseif( grepl("A[6-9]", data[1])){
range <- "A600-A999"
}

put(range)
}

标签: rfor-loopgrouping

解决方案


你可以尝试这样的事情:

> #Round function
> roundUp <- function(x,to=10) {
+   to*(x%/%to + as.logical(x%%to))
+ }
> #Create a dataframe for easy store
> df <- data.frame(data = data, stringsAsFactors = F)
> df %>%
+   mutate(C = substr(data, 1, 1),
+          N = as.integer(substr(data, 2, 4))) %>%
+   mutate(N = roundUp(N, to = 500)) %>%
+   mutate(data2 = paste0(C, N)) %>%
+   select(data, data2)
    data data2
1   U493  U500
2   A429  A500
3   N564 N1000
4   W656 W1000
5   J978 J1000
6   B232  B500
7   D240  D500
8   I796 I1000
9   E831 E1000
...(truncated)

data2字段包含新组


推荐阅读