2017-11-23 19 views
1

私は最終的な所望の出力があるR.Rでこの単純なマージを行う方法は?

で2つのデータセット
> dt_1 
    co_code co_stkdate bse_closing_price bse_returns 
1 21042 1990-01-01    47.50  1.0440 
2 21042 1990-01-02    48.75  1.0263 
3 21042 1990-01-03    42.50  0.8718 
4 22765 1990-01-01    37.00  1.0000 
5 22765 1990-01-02    37.00  1.0000 
6 22765 1990-01-03    37.00  1.0000 


> dt_2 
    co_code co_stkdate bse_market_cap bse_pe 
1 21042 1990-01-01  338.8650 10.7236 
2 21042 1990-01-02  347.7825 11.0058 
3 21042 1990-01-03  303.1950 9.5948 
4 21042 1990-01-04  303.1950 9.5948 
5 22765 1990-01-01  206.7147 6.2263 
6 22765 1990-01-02  206.7147 6.2263 
7 22765 1990-01-03  206.7147 6.2263 
8 22765 1990-01-09  202.5246 6.1001 

をマージしたい:私はマージを試みたが、それは私に希望されていない行(24)の多くを与えている

> dt_3 
    co_code co_stkdate bse_closing_price bse_returns bse_market_cap bse_pe 
1  21042 1990-01-01    47.50  1.0440  338.8650 10.7236 
2  21042 1990-01-02    48.75  1.0263  347.7825 11.0058 
3  21042 1990-01-03    42.50  0.8718  303.1950 9.5948 
4  21042 1990-01-04    NA   NA  303.1950 9.5948 
5  22765 1990-01-01    37.00  1.0000  206.7147 6.2263 
6  22765 1990-01-02    37.00  1.0000  206.7147 6.2263 
7  22765 1990-01-03    37.00  1.0000  206.7147 6.2263 
8  22765 1990-01-09    NA   NA  202.5246 6.1001 

> merge(x = dt_1, y = dt_2, by = "co_code") 
    co_code co_stkdate.x bse_closing_price bse_returns co_stkdate.y bse_market_cap bse_pe 
1 21042 1990-01-01    47.50  1.0440 1990-01-01  338.8650 10.7236 
2 21042 1990-01-01    47.50  1.0440 1990-01-02  347.7825 11.0058 
3 21042 1990-01-01    47.50  1.0440 1990-01-03  303.1950 9.5948 
4 21042 1990-01-01    47.50  1.0440 1990-01-04  303.1950 9.5948 
5 21042 1990-01-02    48.75  1.0263 1990-01-01  338.8650 10.7236 
6 21042 1990-01-02    48.75  1.0263 1990-01-02  347.7825 11.0058 
7 21042 1990-01-02    48.75  1.0263 1990-01-03  303.1950 9.5948 
8 21042 1990-01-02    48.75  1.0263 1990-01-04  303.1950 9.5948 
9 21042 1990-01-03    42.50  0.8718 1990-01-01  338.8650 10.7236 
10 21042 1990-01-03    42.50  0.8718 1990-01-02  347.7825 11.0058 
11 21042 1990-01-03    42.50  0.8718 1990-01-03  303.1950 9.5948 
12 21042 1990-01-03    42.50  0.8718 1990-01-04  303.1950 9.5948 
13 22765 1990-01-01    37.00  1.0000 1990-01-01  206.7147 6.2263 
14 22765 1990-01-01    37.00  1.0000 1990-01-02  206.7147 6.2263 
15 22765 1990-01-01    37.00  1.0000 1990-01-03  206.7147 6.2263 
16 22765 1990-01-01    37.00  1.0000 1990-01-09  202.5246 6.1001 
17 22765 1990-01-02    37.00  1.0000 1990-01-01  206.7147 6.2263 
18 22765 1990-01-02    37.00  1.0000 1990-01-02  206.7147 6.2263 
19 22765 1990-01-02    37.00  1.0000 1990-01-03  206.7147 6.2263 
20 22765 1990-01-02    37.00  1.0000 1990-01-09  202.5246 6.1001 
21 22765 1990-01-03    37.00  1.0000 1990-01-01  206.7147 6.2263 
22 22765 1990-01-03    37.00  1.0000 1990-01-02  206.7147 6.2263 
23 22765 1990-01-03    37.00  1.0000 1990-01-03  206.7147 6.2263 
24 22765 1990-01-03    37.00  1.0000 1990-01-09  202.5246 6.1001 

私はRをマージしています。私はいくつかのスタックオーバーフローの投稿を左の結合、外部の結合などで読んでみるが、それらのすべては私に同じ24行を与える。 How to join (merge) data frames (inner, outer, left, right)?

+0

あなたが持っているものは、多対多の結合です。 'co_code'の各値は、他のデータセットの' co_code'のすべてのインスタンスに結合します。 'co_code 'ごとに4x3 = 12行の出力。各 'co_code'グループ内の各行に対して' time'カラムを追加し、 'by ='変数に 'time'を追加する必要があります。 – thelatemail

+0

@thelatemail Plsはもう一度質問をして、いくつかのフィールドを編集しました。 co_codeとdateの固有の組み合わせに基づいてマージする必要があります。時間変数を追加すると、co_codeとdateの同じ組み合わせに対応する各データセットに何らかの形で同じ時間値を置くと役に立ちます。 –

+5

日付がある場合、それは単なる1対1のマージです。 'merge(x = dt_1、y = dt_2、by = c(" co_code "、" co_stkdate ")、all = TRUE)' – thelatemail

答えて

0

dplyrライブラリを使用して、2つのデータフレームをマージすることができます。

あなたはすべての行だけdt_1におけるものとdt_1に一致するdt_2中のもの、または両方のフレームに存在しているものをしたいかどうかに応じて、あなたが使用する可能性があります - それぞれ - full_joinを、left_join/right_joinまたはinner_joinである。

dt_3 <- full_join(dt_1, dt_2) 

共通の列が同じ名前を持っているので、あなたがby条件を指定する必要はありません。

hereの構文も確認できます。