按百分位数分割矢量

Aki*_*iru 4 split r vector

我需要将R中已排序的未知长度向量拆分为"前10%,...,最低10%"所以,例如,如果我有vector <- order(c(1:98928)),我想将其拆分为10个不同的向量,每个向量代表大约10%的总长度.

香港专业教育学院尝试使用,split <- split(vector, 1:10)但由于我不知道向量的长度,如果它不是多个我得到这个错误

数据长度不是拆分变量的倍数

即使它的多个和函数有效,split()也不保持原始向量的顺序.这就是split给出的:

split(c(1:10) , 1:2)
$`1`
[1] 1 3 5 7 9

$`2`
[1]  2  4  6  8 10
Run Code Online (Sandbox Code Playgroud)

这就是我想要的:

$`1`
[1] 1 2 3 4 5

$`2`
[1]  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

我是R的新手,我一直在尝试很多没有成功的事情,有谁知道怎么做?

李哲源*_*李哲源 6

问题陈述

x每10%的排序向量分成10个块.

请注意,有两种解释:

  1. 按矢量索引切割:

    split(x, floor(10 * seq.int(0, length(x) - 1) / length(x)))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 按矢量值切割(例如,分位数):

    split(x, cut(x, quantile(x, prob = 0:10 / 10, names = FALSE), include = TRUE))
    
    Run Code Online (Sandbox Code Playgroud)

在下面,我将使用数据进行演示:

set.seed(0); x <- sort(round(rnorm(23),1))
Run Code Online (Sandbox Code Playgroud)

特别地,我们的示例数据是正态分布而不是均匀分布,因此通过索引切割和按值切割是显着不同的.

结果

按指数削减

#$`0`
#[1] -1.5 -1.2 -1.1
#
#$`1`
#[1] -0.9 -0.9
#
#$`2`
#[1] -0.8 -0.4
#
#$`3`
#[1] -0.3 -0.3 -0.3
#
#$`4`
#[1] -0.3 -0.2
#
#$`5`
#[1] 0.0 0.1
#
#$`6`
#[1] 0.3 0.4 0.4
#
#$`7`
#[1] 0.4 0.8
#
#$`8`
#[1] 1.3 1.3
#
#$`9`
#[1] 1.3 2.4
Run Code Online (Sandbox Code Playgroud)

按分位数切割

#$`[-1.5,-1.06]`
#[1] -1.5 -1.2 -1.1
#
#$`(-1.06,-0.86]`
#[1] -0.9 -0.9
#
#$`(-0.86,-0.34]`
#[1] -0.8 -0.4
#
#$`(-0.34,-0.3]`
#[1] -0.3 -0.3 -0.3 -0.3
#
#$`(-0.3,-0.2]`
#[1] -0.2
#
#$`(-0.2,0.14]`
#[1] 0.0 0.1
#
#$`(0.14,0.4]`
#[1] 0.3 0.4 0.4 0.4
#
#$`(0.4,0.64]`
#numeric(0)
#
#$`(0.64,1.3]`
#[1] 0.8 1.3 1.3 1.3
#
#$`(1.3,2.4]`
#[1] 2.4
Run Code Online (Sandbox Code Playgroud)


Slo*_*uei 5

如果您将矢量作为数据框中的列(名为vec),您可以简单地执行以下操作:

df$new_vec <- cut(df$vec , breaks = quantile(df$vec, c(0, .1,.., 1)), 
                labels=1:10, include.lowest=TRUE)
Run Code Online (Sandbox Code Playgroud)