r - 如何快速分组大量元素
问题描述
我在这里创建了一些“数据”作为示例。它包含 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)
}
解决方案
你可以尝试这样的事情:
> #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
字段包含新组
推荐阅读
- json - 当我的 JSON 列是动态的时,JSON 文件到 CSV 文件的转换
- python - 如何获取行(列表)中至少一个元素中包含特定值(字符串)的列表(行)的数量?
- javascript - 如何找到第一个数组和第二个数组之间的差异
- mysql - 为什么两个选择查询的联合不起作用?
- python - 由于 Python 中的循环导入,如何解决类依赖性?
- python - 单击 Python Folium 地图上显示的 GeoJson 图层功能
- reactjs - 为什么在 eventListener 上验证输入不起作用?
- php - 来自 ZIP 存档的 Laravel 文件名列表,显示在刀片中
- python - 如何在python中按自定义顺序对列表进行排序?
- python - 错误:找不到满足 dask-cudf 要求的版本(来自版本:无)