2012-07-06 40 views
6

Dưới đây là ví dụ nhỏ của tôi: ...........lọc có điều kiện/subseting dữ liệu trong dữ liệu khoảng cách tuyến tính trong r

Mark <- paste ("SN", 1:400, sep = "") 
highway <- rep(1:4, each = 100) 
set.seed (1234) 
MAF <- rnorm (400, 0.3, 0.1) 
PPC <- abs (ceiling(rnorm (400, 5, 5))) 

set.seed (1234) 
Position <- round(c(cumsum (rnorm (100, 5, 3)), 
cumsum (rnorm (100, 10, 3)), cumsum (rnorm (100, 8, 3)), 
    cumsum (rnorm (100, 6, 3))), 1) 

mydf <- data.frame (Mark, highway, Position, MAF, PPC) 

Tôi muốn lọc dữ liệu đó là ít hơn 10 cho PPC tại thời điểm lớn hơn 0,3 đối với MAF.

# filter PPC < 10 & MAF > 0.3 
filtered <- mydf[mydf$PPC < 10 & mydf$MAF > 0.3,] 

Tôi có biến nhóm - đường cao tốc và mỗi Dấu có vị trí trên đường cao tốc. Ví dụ đường cao tốc 1 trong năm đánh dấu đầu tiên:

 1.4  7.2  15.5 13.4 19.7 
|-----|.......|.......|.....|.....| 
     "SN1" "SN2" "SN3" "SN4" "SN5" 

Bây giờ tôi muốn chọn bất kỳ ~ 30 Marks như vậy mà họ được phân phối tốt trong mỗi đường cao tốc dựa trên vị trí trên mỗi đường cao tốc (xem xét độ dài khác nhau của đường cao tốc) và tối thiểu khoảng cách giữa hai chọn là không ít hơn 10

Edit: ý tưởng (phác thảo thô) enter image description here

tôi có thể nghĩ một chút về cách giải quyết câu hỏi này. Giúp đánh giá cao.

Chỉnh sửa: Ở đây cái gì đó tôi có thể hình dung ra:

# The maximum (length) of each highway is: 
out <- tapply(mydf$Position, mydf$highway, max) 
out 
    1  2  3  4 
453.0 1012.4 846.4 597.6 

min(out) 
[1] 453 

#Total length of all highways 
totallength <- sum(out) 

# Thus average distance at which mark need to be placed: 
totallength/30 
[1] 96.98 

Đối với quốc lộ 1, các nhãn hiệu theoritical có thể là tại địa chỉ:

96.98, 96.98+ 96.98, 96.98+96.98+ 96.98, ........till it is less 
    than maximum (length)for highway 1. 

Như vậy theoritically chúng ta cần phải chọn đánh dấu ở mọi 96,98 . Tuy nhiên, dấu đặt trong đường cao tốc có thể không được foud tại

lưu ý: tổng kết quả lựa chọn nhà dấu ngoặc không cần phải chính xác 30 (khoảng 30)

+0

Sự cố vẫn chưa được giải quyết, vui lòng cho tôi biết nếu bạn có bất kỳ gợi ý nào – shNIL

Trả lời

3

Kể từ khi chúng tôi không bận tâm về bất kỳ cột khác, mã sẽ dễ dàng hơn một chút nếu chúng ta sử dụng tách để có được danh sách các vị trí.

filtered$highway <- factor(filtered$highway) 
positions <- with(filtered, split(Position, highway)) 

Có thể tìm thấy số điểm phù hợp trong mỗi đường cao tốc theo chiều dài tương ứng của mỗi đường cao tốc.

highway_lengths <- sapply(positions, max) 
total_length <- sum(highway_lengths) 
n_marks_per_highway <- round(30 * highway_lengths/total_length) 

Chúng tôi có thể sử dụng chức năng định lượng để lấy các điểm mục tiêu được đặt cách đều nhau dọc theo mỗi đường cao tốc.

target_mark_points <- mapply(
    function(pos, n) 
    { 
    quantile(pos, seq.int(0, 1, 1/(n - 1))) 
    }, 
    positions, 
    n_marks_per_highway 
) 

Đối với mỗi điểm mục tiêu, chúng tôi tìm thấy dấu hiện tại gần nhất trên đường cao tốc.

actual_mark_points <- mapply(
    function(pos, target) 
    { 
    sapply(target, function(tgt) 
    { 
     d <- abs(tgt - pos) 
     pos[which.min(d)] 
    }) 
    }, 
    positions, 
    target_mark_points 
) 

Chỉ để thấy rằng nó hoạt động, bạn có thể hình dung nhãn hiệu.

is_mark_point <- mapply(
    function(pos, mark) 
    { 
    pos %in% mark 
    }, 
    positions, 
    actual_mark_points 
) 

filtered$is.mark.point <- unsplit(is_mark_point, filtered$highway) 

library(ggplot2)  
(p <- ggplot(filtered, aes(Position, highway, colour = is.mark.point)) + 
    geom_point() 
) 
Các vấn đề liên quan