4

同じ長さであるが、同等の要素の数が異なる2つの長いリストAとBがあります。
リストAには、同じフィールドで繰り返すことができる多くの要素を含めることができます。
リストBには、要素が1つだけ含まれているか、空のフィールド、つまり「character(0)」が含まれています。
Aにもいくつかの空のフィールドが含まれていますが、これらのレコードには常にBに要素が存在するため、AとBに空のフィールドを持つレコードはありません。AとB
の要素を同じ長さの新しいリストに結合したいのですが、 C、次の規則に従います。

  • Aのすべての要素は、同じフィールドでの潜在的な再発を含め、Cに存在する必要があります。
  • 同じレコードのAにまだ存在していない要素がBに含まれている場合は、Cにも追加されます。
  • ただし、Bに同じレコードのAにすでに存在する要素が含まれている場合、それは無視されます。
  • Aに空のフィールドがある場合、このレコードのBの要素がCに追加されます。
  • Bに空のフィールドがある場合、このレコードのAの要素がCに追加されます。

これは、これらのリストがどのように始まるかの例です。

> A  
 [1] "JAMES" "JAMES"  
 [2] "JOHN" "ROBERT"  
 [3] "WILLIAM" "MICHAEL" "WILLIAM" "DAVID" "WILLIAM"  
 [4] character(0)  
...  
> B  
 [1] "RICHARD"  
 [2] "JOHN"  
 [3] character(0)  
 [4] "CHARLES"  
...  

これは私が探している正しい出力です:

> C  
 [1] "JAMES" "JAMES" "RICHARD"  
 [2] "JOHN" "ROBERT"  
 [3] "WILLIAM" "MICHAEL" "WILLIAM" "DAVID" "WILLIAM"  
 [4] "CHARLES"  
... 

私は試しました、例えば:

C <- sapply(mapply(union, A,B), setdiff, character(0))  

しかし、これにより、残念ながらAからの再発が削除されました。

> C  
 [1] "JAMES" "RICHARD"  
 [2] "JOHN" "ROBERT"  
 [3] "WILLIAM" "MICHAEL" "DAVID"  
 [4] "CHARLES"  
...  

誰かが私に、これら2つのリストを組み合わせて、Aからの繰り返しを保存し、私が望む出力を達成する方法を教えてもらえますか?

事前にどうもありがとうございました!

更新:機械可読データ:

A <- list(c("JAMES","JAMES"),
          c("JOHN","ROBERT"), 
          c("WILLIAM","MICHAEL","WILLIAM","DAVID","WILLIAM"),  
          character(0))
B <- list("RICHARD","JOHN",character(0),"CHARLES")
4

1 に答える 1

7

再現可能な形式のデータの抜粋は次のとおりです。

A <- list(c("JAMES","JAMES"),
          c("JOHN","ROBERT"), 
          c("WILLIAM","MICHAEL","WILLIAM","DAVID","WILLIAM"),  
          character(0))
B <- list("RICHARD","JOHN",character(0),"CHARLES")

あなたはに近かったmapply()c()を使用してリスト要素を連結するAことで目的の出力を取得しましたBが、提供されたベクトルの要素を操作する必要があったため、次のことを思いつきました。

foo <- function(...) {
    l1 <- length(..1)
    l2 <- length(..2)
    out <- character(0)
    if(l1 > 0) {
        if(l2 > 0) {
            out <- if(..2 %in% ..1)
                ..1
            else
                c(..1, ..2)
        } else {
            out <-  ..1
        }
    } else {
        out <-  ..2
    }
    out
}

プレースホルダーを...使用する際の個々の要素を参照できます。であり、です。もちろん、2つのリストでのみ機能しますが、物事を単純にするために、これを強制したり、チェックを行ったりすることはありません。また、どちらかまたは両方が現在私が考えているケースを処理する必要があります。..n..1A..2Bfoo()foo()ABcharacter(0)foo()

mapply()通話でそれを使用すると、次のようになります。

> mapply(foo, A, B)
[[1]]
[1] "JAMES"   "JAMES"   "RICHARD"

[[2]]
[1] "JOHN"   "ROBERT"

[[3]]
[1] "WILLIAM" "MICHAEL" "WILLIAM" "DAVID"   "WILLIAM"

[[4]]
[1] "CHARLES"

lapply()バージョンは抽象よりも意味があるかもしれませんが、本質..n的に同じコードを使用します。Aこれは、直接動作する新しい関数ですが、 :によって生成された( )Bの要素のインデックスを反復処理します。A1, 2, 3, length(A)seq_along()

foo2 <- function(ind, A, B) {
    l1 <- length(A[[ind]])
    l2 <- length(B[[ind]])
    out <- character(0)
    if(l1 > 0) {
        if(l2 > 0) {
            out <- if(B[[ind]] %in% A[[ind]]) {
                A[[ind]]
            } else {
                c(A[[ind]], B[[ind]])
            }
        } else {
            out <- A[[ind]]
        }
    } else {
        out <- B[[ind]]
    }
    out
}

これは次のように呼ばれます:

> lapply(seq_along(A), foo2, A = A, B = B)
[[1]]
[1] "JAMES"   "JAMES"   "RICHARD"

[[2]]
[1] "JOHN"   "ROBERT"

[[3]]
[1] "WILLIAM" "MICHAEL" "WILLIAM" "DAVID"   "WILLIAM"

[[4]]
[1] "CHARLES"
于 2012-06-14T10:14:35.483 に答える