我必须在r中把一个向量分成n个相等大小的块,我找不到任何基函数来做这个。谷歌也没帮上什么忙。这是我目前想到的;

x <- 1:10
n <- 3
chunk <- function(x,n) split(x, factor(sort(rank(x)%%n)))
chunk(x,n)
$`0`
[1] 1 2 3

$`1`
[1] 4 5 6 7

$`2`
[1]  8  9 10

当前回答

我需要一个接受数据参数的函数。Table(引号中)和另一个参数,该参数是原始data.table的子集中行数的上限。这个函数产生任意数量的数据。表的上限允许:

library(data.table)    
split_dt <- function(x,y) 
    {
    for(i in seq(from=1,to=nrow(get(x)),by=y)) 
        {df_ <<- get(x)[i:(i + y)];
            assign(paste0("df_",i),df_,inherits=TRUE)}
    rm(df_,inherits=TRUE)
    }

这个函数给出了一系列数据。命名为df_[number]的表,其起始行来自原始数据。表中的名称。最后一个数据。表可以很短,并且填满了NAs,所以你必须将其子集返回到任何剩下的数据。这种类型的函数很有用,因为某些GIS软件对您可以导入的地址引脚数量有限制。切片数据。不建议将表分成更小的块,但这可能是不可避免的。

其他回答

试试ggplot2函数,cut_number:

library(ggplot2)
x <- 1:10
n <- 3
cut_number(x, n) # labels = FALSE if you just want an integer result
#>  [1] [1,4]  [1,4]  [1,4]  [1,4]  (4,7]  (4,7]  (4,7]  (7,10] (7,10] (7,10]
#> Levels: [1,4] (4,7] (7,10]

# if you want it split into a list:
split(x, cut_number(x, n))
#> $`[1,4]`
#> [1] 1 2 3 4
#> 
#> $`(4,7]`
#> [1] 5 6 7
#> 
#> $`(7,10]`
#> [1]  8  9 10

不确定这是否回答了OP的问题,但我认为%%在这里可能有用

df # some data.frame
N_CHUNKS <- 10
I_VEC <- 1:nrow(df)
df_split <- split(df, sort(I_VEC %% N_CHUNKS))

使用base R的rep_len:

x <- 1:10
n <- 3

split(x, rep_len(1:n, length(x)))
# $`1`
# [1]  1  4  7 10
# 
# $`2`
# [1] 2 5 8
# 
# $`3`
# [1] 3 6 9

正如前面提到的,如果你想要排序的下标,简单地:

split(x, sort(rep_len(1:n, length(x))))
# $`1`
# [1] 1 2 3 4
# 
# $`2`
# [1] 5 6 7
# 
# $`3`
# [1]  8  9 10

分割(x,矩阵(1:n, n,长度(x))(1:长度(x)))

也许这更清楚,但同样的想法: 分割(x,代表(1:n,天花板(长度(x) / n)、长度。Out = length(x))

如果你想对它排序,就对它进行排序

还有一种可能是package parallel中的splitIndices函数:

library(parallel)
splitIndices(20, 3)

给:

[[1]]
[1] 1 2 3 4 5 6 7

[[2]]
[1]  8  9 10 11 12 13

[[3]]
[1] 14 15 16 17 18 19 20

注意:这只适用于数值。如果你想拆分一个字符向量,你需要做一些索引:lapply(splitIndices(20,3), \(x) letters[1:20][x])