6

これが私の小さな例です:..........。

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)

PPCでは10未満、MAFでは0.3より大きいデータをフィルタリングしたいと思います。

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

グループ化変数(高速道路)があり、各マークには高速道路上の位置があります。たとえば、最初の5つのマークの高速道路1:

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

ここで、各高速道路の位置に基づいて(高速道路の長さの違いを考慮して)各高速道路に適切に分散され、2つのピック間の最小距離が10以上になるように、約30個のマークを選択します。

編集:アイデア(ラフスケッチ) ここに画像の説明を入力してください

この質問を解決する方法について少し考えることができました。感謝します。

編集:ここで私が理解できる何か:

# 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 

高速道路1の場合、理論上のマークは次のようになります。

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

したがって、理論的には、96.98ごとにマークを選択する必要があります。しかし、高速道路に配置されたマークは、

注:マークの選択の合計結果は、正確に30(約30)である必要はありません。

4

1 に答える 1

3

他の列については気にしないので、splitを使用して位置のリストを取得すると、コードが少し簡単になります。

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

各高速道路の相対的な長さを使用して、各高速道路の適切な数のマークを見つけることができます。

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

分位関数を使用して、各高速道路に沿って等間隔に配置されたターゲットポイントを取得できます。

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

各ターゲットポイントについて、高速道路で最も近い既存のマークを見つけます。

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

それが機能することを確認するだけで、マークを視覚化できます。

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()
)
于 2012-07-18T08:04:35.493 に答える