2016-09-26 1 views
-3

左のエントリをすべて保持しながら(右から1つ追加しないで)左右に存在する場合にのみ右から追加しながら2つのテーブルに参加します。 左内部結合の種類(これはおそらく存在しません)。例えば正確な左テーブルを保持しながら2つのデータフレームを結合します

私はBに参加したいとABを取得したい:2が複数回存在し、3は右側に存在しない

ありがとうので

A= 
    1 
    2 
    3 
    4 

    B= 
    1 X 
    2 Y 
    2 Z 
    4 Z 
    5 ZZ 

    AB= 
    1 X 
    2 NaN 
    3 NaN 
    4 Z 

2と3がNaNでありますヘルプのため

+1

を[良い質問をする方法](http://stackoverflow.com/help/how-to-ask)と[再現可能な例を与える方法](http://stackoverflow.com/questions/)の情報をお読みください。 5963269/how-to-make-a-r-reproducible-example/5963 610)。これは他の人があなたを助けることをはるかに容易にします。 – Jaap

+1

さらに、このQ&Aを読むこともできます:[データフレームの結合(マージ)の仕方(内側、外側、左、右)?](http://stackoverflow.com/questions/1299871/how-to-join-merge -data-frames-inner-outer-left-right) – Jaap

+0

ちょっと、私はすべての結合を読んで、Q&Asをマージして答えを見つけることができませんでした。 – Squeezie

答えて

1

別のアプローチを使用してマージ:

A <- structure(list(id = 1:4), .Names = "id", row.names = c(NA, -4L), class = "data.frame") 
B <- structure(list(id = c("1", "2", "2", "4", "5"), val = c("X", "Y", "Z", "Z", "ZZ")), .Names = c("id", "val"), row.names = c(NA, 5L), class = "data.frame") 

# Cleanup duplicated id in B (could be used in the merge to avoid creating a new object, done here for ease of reading) 
NB <- B[!B$id %in% B$id[duplicated(B$id)],] 

# left merge of A and B on id 
merge(A,NB,all.x=TRUE,by="id") 

は与える:

id val 
1 1 X 
2 2 <NA> 
3 3 <NA> 
4 4 Z 
+0

ねえ、私は私の質問を編集しました。 それは起こることができます、そのBは長く、その後、私は私たちはURの答えを使用することはできないと思う。 – Squeezie

+0

@スクイジーあなたは間違っていると思っています。編集されたデータでは、それでも4行(つまり、A:Aと同じ行数)を与えます。 – Tensibai

+0

これは完璧な仕事でした。ありがとうございました! – Squeezie

2

あなたの質問に「時系列」データがあります。そのタイプのデータは、一般的なテーブル形式または特定のR tsオブジェクトになります。 tsクラスは、時系列解析を支援する特別なプロパティが与えられた特別な型のベクトルまたは行列です。このアプローチでは、後者の場合、オブジェクトがclass(A) [1] "data.frame"であると想定します。

これは、条件一致よりもマージされていません。

indx <- sapply(A$col1, function(x) sum(B$col1 %in% x) == 1L) 
data.frame(v1=A$col1, v2=ifelse(indx, B$col2, NaN), stringsAsFactors=FALSE) 
# v1 v2 
# 1 1 X 
# 2 2 NaN 
# 3 3 NaN 
# 4 4 Z 

注:factor罠に落ちないようにしてください1とBA値のうち1つだけ一致がある場合我々はテストすることができます。 Rは自動的に文字値をクラスcharacterにないクラスfactorにコード化します。この問題を回避するには、(おそらく、はるかに効率的@Pierreの回答より)(左結合)クリーンアップでstringsAsFactors=FALSE

#Data 
A <- data.frame(col1=1:4L) 
B <- data.frame(col1=c(1,2,2,4), col2=c("X", "Y", "Z", "Z"), stringsAsFactors=FALSE) 
関連する問題