R 按百分比分割向量

R 按百分比分割向量,r,vector,split,R,Vector,Split,我需要将R中的排序未知长度向量拆分为“前10%,…,后10%。” 因此,例如,如果我有vector,如果向量被排序,那么您可以创建一个具有相同向量长度的组变量,并对其进行拆分。在实际情况下,由于向量的长度可能不是10的倍数,因此需要更多的努力,但对于您的玩具示例,您可以执行以下操作: n = 2 split(x, rep(1:n, each = length(x)/n)) # $`1` # [1] 1 2 3 4 5 # $`2` # [1] 6 7 8 9 10 一个实际示例,其中

我需要将R中的排序未知长度向量拆分为“前10%,…,后10%。”
因此,例如,如果我有
vector,如果向量被排序,那么您可以创建一个具有相同向量长度的组变量,并对其进行拆分。在实际情况下,由于向量的长度可能不是10的倍数,因此需要更多的努力,但对于您的玩具示例,您可以执行以下操作:

n = 2
split(x, rep(1:n, each = length(x)/n))
# $`1`
# [1] 1 2 3 4 5

# $`2`
# [1]  6  7  8  9 10
一个实际示例,其中向量的长度不是组数的倍数:

vec = 1:13
n = 3
split(vec, sort(seq_along(vec)%%n))
# $`0`
# [1] 1 2 3 4

# $`1`
# [1] 5 6 7 8 9

# $`2`
# [1] 10 11 12 13
问题陈述 每10%将一个排序向量
x
分成10个块

注:对此有两种解释:

  • 按矢量索引进行切割

    split(x, floor(10 * seq.int(0, length(x) - 1) / length(x)))
    
    split(x, cut(x, quantile(x, prob = 0:10 / 10, names = FALSE), include = TRUE))
    
  • 按矢量值(如分位数)切割

    split(x, floor(10 * seq.int(0, length(x) - 1) / length(x)))
    
    split(x, cut(x, quantile(x, prob = 0:10 / 10, names = FALSE), include = TRUE))
    
  • 在下面,我将使用数据进行演示:

    set.seed(0); x <- sort(round(rnorm(23),1))
    
    按分位数切割

    #$`[-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
    

    如果将向量作为数据帧中的列(名为
    vec
    ),则可以执行以下操作:

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

    df$new\u vec我知道我不应该仅仅为了说声谢谢而发表评论(因此是向上投票),但我花了好几个小时寻找这个解决方案,而且效果非常好。谢谢
    
    x <- 1:98
    y <- split(x, ((seq(length(x))-1)*10)%/%length(x)+1)
    
    seq(length(x)) = 1..98
    
    seq(length(x))-1 = 0..97
    
    (seq(length(x))-1)*10 = (0, 10, ..., 970)
    
    # each number about 10% of values, totally 98
    ((seq(length(x))-1)*10)%/%length(x) = (0, ..., 0, 1, ..., 1, ..., 9, ..., 9) 
    
    # each number about 10% of values, totally 98
    seq(length(x))-1)*10)%/%length(x)+1 = (1, ..., 1, 2, ..., 2, ..., 10, ..., 10)  
    
    # splits first ~10% of numbers to 1, next ~10% of numbers to 2 etc.
    split(x, ((seq(length(x))-1)*10)%/%length(x)+1) 
    
    df$new_vec <- cut(df$vec , breaks = quantile(df$vec, c(0, .1,.., 1)), 
                    labels=1:10, include.lowest=TRUE)