2016-05-18 13 views
9

Nếu tôi có một vectơ các chuỗi có độ dài bất kỳ nói;Lấy mẫu một vector bằng cách chia đều

vec <- c("a","b","c","d","e","f","g","h","i") 

Tôi đang tìm hàm để lấy mẫu số n giá trị từ véc tơ này bằng cách sử dụng chiến lược được hiển thị bên dưới. Hiển thị số liệu vì rất khó giải thích.

function call: 
result: 
schematic diagram: 

fn(vector=vec,n=1) 
"a" 

| 
a b c d e f g h i 


fn(vector=vec,n=2) 
"a" "i" 
_______________ 
|    | 
a b c d e f g h i 


fn(vector=vec,n=3) 
"a" "e" "i" 
_______________ 
|  |  | 
a b c d e f g h i 


fn(vector=vec,n=4) 
"a" "c" "g" "i" 
_______________ 
| |  |  | 
a b c d e f g h i 


fn(vector=vec,n=5) 
"a" "c" "e" "g" "i" 
_______________ 
| | | | | 
a b c d e f g h i 

Việc lấy mẫu không cần phải chính xác. Các giá trị có thể từ gần đúng vùng nhưng phải nhất quán. Chuỗi chuỗi có thể là chẵn hoặc lẻ.

Trả lời

7

Một cách sẽ được sử dụng seq(), lợi dụng nó length.out= lập luận để có được các chỉ số đều nhau mà bạn tìm kiếm:

fn <- function(x, n) { 
    x[round(seq(1,length(x), length.out=n))] 
} 

## Check that it works 
fn(vec, 1) 
# [1] "a" 
fn(vec, 2) 
# [1] "a" "i" 
fn(vec, 4) 
# [1] "a" "d" "f" "i" 
fn(vec, 8) 
# [1] "a" "b" "c" "d" "f" "g" "h" "i" 
+1

Tôi ngạc nhiên bởi sự đơn giản của một lớp lót này để giải quyết vấn đề dường như khó khăn này. – rmf

0

này nên làm những gì bạn đang tìm kiếm:

fn <- function(myVector, n) { 
    # check for valid n 
    if(n > length(myVector)) stop("invalid n") 

    if(n == 1) return(myVector[1]) 
    if(n == 2) return(myVector[c(1, length(myVector))]) 

    middleSpots <- ceiling(length(vec) * (1:(n-2)/(n-1))) 
    return(myVector[c(1, middleSpots, length(myVector))]) 
} 
Các vấn đề liên quan