2

次のフレームワーク データセットがあります。

master <- data.frame (namest = c("A","B", "C","D", "E", "F"), 
 position =c( 0, 10, 20, 25, 30, 35))
master
      namest position
    1      A        0
    2      B       10
    3      C       20
    4      D       25
    5      E       30
    6      F       35

これは、場所の名前と位置がある大きな地図 (ロード マップなど) です。2 番目の調査では、より小さなサブセットがあります (多数、ここでは 3 つだけ)。

subset1 <- data.frame (namest = c("I", "A", "ii", "iii", "B"), 
 position = c(0, 10, 12, 14, 20))  
subset1
  namest position
1      I        0
2      A       10
3     ii       12
4    iii       14
5      B       20

subset2 <- data.frame (namest = c("E", "vii", "F"), position = c(0, 3,5))
 subset2
  namest position
1      E        0
2    vii        3
3      F        5

subset3 <- data.frame (namest = c("D", "vi", "v", "C", "iv"), 
   position = c(0, 2, 3, 5, 8))
subset3
  namest position
1      D        0
2     vi        2
3      v        3
4      C        5
5     iv        8

各サブセットには、master に共通する 2 つの名前があります。たとえば、subset3 の D と C です。

これらのサブセットを組み合わせて、より詳細なマスターを作成したいと考えています。新しい namest が新しいマップに配置されることを意味します。一部のサブセット (subset3 を参照) の順序がマスターと逆になっていることを確認してください。

したがって、期待される出力は次のとおりです。

subsetalign <- data.frame(subsett = c(rep ("A-B", nrow(subset1)),
rep("C-D", nrow(subset3)), 
rep("E-F", nrow(subset2))), namest =  c(c("I", "A", "ii", "iii", "B"), 
rev (c("D", "vi", "v", "C", "iv")),c("E", "vii", "F")), 
position = c(subset1$position, rev (subset3$position), subset2$position))

 subsetalign
   subsett namest position
1      A-B      I        0
2      A-B      A       10
3      A-B     ii       12
4      A-B    iii       14
5      A-B      B       20
6      C-D     iv        8
7      C-D      C        5
8      C-D      v        3
9      C-D     vi        2
10     C-D      D        0
11     E-F      E        0
12     E-F    vii        3
13     E-F      F        5

出力プロセスは次のように視覚化できます (この時点では、説明をわかりやすくするために、そのような図を作成するつもりはありません)。

ここに画像の説明を入力

編集: 次の 2 つの理由により、単純に rbind ではありません。

(a) サブセットは、コマンド名がマスター ファイルでどのように配置されているかに基づいて順序付けられます。たとえば、サブセット 1 (AB) + サブセット 3 (CD) + サブセット 2 (EF) の場合、マスターでの順序は ABCDEF です。

(b) また、サブセットの順序がマスターと逆の場合は、逆にする必要があります。サブセット 3 では、namest の順序は「D」-「vi」-「v」-「C」-「iv」ですが、マスターでは D が C の後に来るため、この sustet 3 はバインドする前に反転する必要があります。

4

1 に答える 1

2

サブセットがリストにあると仮定します

subsets <- list(subset1, subset2, subset3)

マスター内のアンカーの位置は次のとおりです。

idx <- lapply(subsets, function(x, y) match(x$namest, y$namest), master)

各サブセットの方向は次のとおりです。

orientation <- sapply(idx, function(elt) unique(diff(elt[!is.na(elt)])))

そしてマスターの位置は

position <- sapply(idx, function(elt) min(elt, na.rm=TRUE))

サブセットは順序付けできsubsets[order(position)]、必要に応じて逆にすることができます

updt <- Map(function(elt, dir) {
    if (dir == -1)
        elt[rev(seq_len(nrow(elt))),] 
   else elt
}, subsets[order(position)], orientation[order(position)])

rbind一緒に編集、do.call(rbind, updt)masterこれは、のすべての間隔が1回だけ表されることを前提としています。

于 2012-06-03T16:42:33.310 に答える