2016-07-24 74 views
1

我需要將一個排序後的未知長度向量分解爲「前10%,...,後10%」 因此,例如,如果我有vector <- order(c(1:98928)),我想將其分割爲10不同的向量,每個向量佔總長度的大約10%。使用split <- split(vector, 1:10)將百分位向量分割一個向量

香港專業教育學院嘗試,但我不知道該向量的長度,我得到這個錯誤,如果它不是多

數據長度不是分裂變量的多

即使如果它的倍數和功能起作用,split()不會保留我原始矢量的順序。這是分給:

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

$`2` 
[1] 2 4 6 8 10 

而這正是我想要的:

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

$`2` 
[1] 6 7 8 9 10 

林新手在R和香港專業教育學院一直在嘗試很多事情沒有成功,沒有人知道如何做到這一點?

回答

3

問題陳述

分段的排序矢量x每10%到10塊。

注意有兩種解釋了這一點:

切割用矢量指數
  1. split(x, floor(10 * seq.int(0, length(x) - 1)/length(x))) 
    
  2. 切割用矢量值(比方說,分位數)

    split(x, cut(x, quantile(x, prob = 0:10/10, names = FALSE), include = TRUE)) 
    

在下文中,我將利用數據使示範:

set.seed(0); x <- sort(round(rnorm(23),1)) 

特別地,我們的例子中的數據是正態分佈的,而不是均勻分佈的,通過索引和切割,以便切割由值顯着不同。

結果

由索引切削

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

切削由位數

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

如果向量被排序,那麼您可以創建一個具有相同長度的向量並在其上分割的組變量。在現實情況下,這將需要自向量的長度多一點努力,可能不是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 
3
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) 
1

如果你有你的載體爲一列中數據幀(名爲vec),你可以簡單地做這樣的事情:

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