2

同じ長さの 2 つのベクトルがあります。これは、4 つの行を特徴とする単純な例です。

[1] green  
[2] black, yellow  
[3] orange, white, purple  
[4] NA  

[1] red  
[2] black  
[3] NA  
[4] blue  

1 番目または 2 番目のベクトルに NA が存在する可能性がありますが、各行では、それらの少なくとも 1 つに常に値があります。最初のベクトルには 1 つ以上の値を含めることができますが、2 番目のベクトルには値を 1 つだけ含めることができます。出力が次のようになるように、これらの 2 つのベクトルを行ごとに「選択的に」結合したいと思います。

[1] green, red  
[2] black, yellow  
[3] orange, white, purple  
[4] blue  

これは、最初のベクトルの内容が常に出力に存在する必要があることを意味します。最初のベクトルの行に NA がある場合、2 番目のベクトルの同じ行の値によって上書きされます。
この値がまだ最初のベクトルの同じ行にない場合、2 番目のベクトルのコンテンツが追加されます。2 番目のベクトルの NA は無視されます。

私は試した:

merge(A,B)
merge(A, B, all=TRUE)
merge(A, B, all.x=TRUE)
merge(A, B, all.y=TRUE) 

しかし、それらはすべてまったく異なる結果をもたらします。

上記のように、この「選択的な」結合を実現するにはどうすればよいですか?

よろしくお願いします!

4

2 に答える 2

3

You're essentially trying to do a "union, then throw away any NAs", so how about this one-liner?

A = list( 'green', c('black', 'yellow'), c('orange', 'white', 'purple'), NA)                                                             

B = list( 'red', 'black', NA, 'blue')    

> sapply(mapply(union, A,B), setdiff, NA)                                                                                               
 [[1]]                                                                                                                                   
 [1] "green" "red"                                                                                                                       

 [[2]]                                                                                                                                   
 [1] "black"  "yellow"                                                                                                                   

 [[3]]                                                                                                                                   
 [1] "orange" "white"  "purple"                                                                                                          

 [[4]]                                                                                                                                   
 [1] "blue"     
于 2012-05-08T14:00:21.793 に答える
2

このデータをどのように入力するかはわかりませんがdata.frame、データを2つのリストに入れると、その方法がわかります。これが私の試みです(以下のコメント提案にクレジットを付けて):

# get the data
a <- c("green","black, yellow","orange, white, purple",NA)
b <- c("red","black",NA,"blue");

# strip any spaces first
a <- gsub("[[:space:]]+","",a)
b <- gsub("[[:space:]]+","",b)

# convert to lists
alist <- strsplit(a,",")
blist <- strsplit(b,",")

# join the lists
abjoin <- mapply(c,alist,blist)
# remove any duplicates and NA's
abjoin <- lapply(abjoin,function(x) (unique(x[complete.cases(x)])))

# result
> abjoin
[[1]]
[1] "green" "red"  

[[2]]
[1] "black"  "yellow"

[[3]]
[1] "orange" "white"  "purple"

[[4]]
[1] "blue"

そして、各カラーセットがコンマで分割されたベクトルに変換するには:

sapply(abjoin,paste,collapse=",")
#[1] "green,red"           "black,yellow"        "orange,white,purple"
#[4] "blue"  
于 2012-05-08T10:08:46.690 に答える