2016-08-03 9 views
0

col_idという共通の列でデータフレームを区切る必要があります。複数行の列別にマージ

私の問題は、単純なマージは私の場合には理想的ではないということです。私が持っているしたい出力が同じで第二のDFのすべてのセルを埋めるためにある

 col_id stock ch2 
1 id_100 stock 2 yes 
2 id_100002 stock 2 no 
3 id_100003 stock 2 no 

そして第二に、DFのための

 col_id num cat1 
1 id_100 num 2 0 
2 id_100 num 2 1 
3 id_100 num 2 0 
4 id_100002 num 2 1 
5 id_100002 num 2 1 
6 id_100002 num 2 1 
7 id_100003 num 2 1 
8 id_100003 num 2 1 

をcol_idここ

はDF1の構成例でありますdf oneの値。あなたがmerge機能のall.x/all.y引数を使用するように出力の例は

 col_id num cat1 stock ch2 
1 id_100 num 2 0 stock 2 yes 
2 id_100 num 2 1 stock 2 yes 
3 id_100 num 2 0 stock 2 yes 
4 id_100002 num 2 1 stock 2 no 
5 id_100002 num 2 1 stock 2 no 
6 id_100002 num 2 1 stock 2 no 
7 id_100003 num 2 1 stock 2 no 
8 id_100003 num 2 1 stock 2 no 
+0

テーブルを貼り付けるのではなく、データフレームとしてテーブルを提供できますか? – user5249203

+0

@ user5249203はい、ソースはありますが、直接ロードするにはdf構造が必要であると理解できますか? – Jake

答えて

1

試してみてください。

install.packages('dplyr') 
library(dplyr) 

mytext1 = "col_id,stock, ch2 
id_100,stock 2, yes 
id_100002,stock 2, no 
id_100003,stock 2, no" 
mydf1 <- read.table(text=mytext1, header=T, sep=",") 

mytext2 = "col_id,num, cat1 
id_100,num 2, 0 
id_100,num 2, 1 
id_100,num 2, 0 
id_100002,num 2, 1 
id_100002,num 2, 1 
id_100002,num 2, 1 
id_100003,num 2, 1 
id_100003,num 2, 1" 

mydf2 <- read.table(text=mytext2, header=T, sep=",") 
output_df <- left_join(mydf2,mydf1, by="col_id") 

    col_id num cat1 stock ch2 
id_100 num 2 0 stock 2 yes 
id_100 num 2 1 stock 2 yes 
id_100 num 2 0 stock 2 yes 
id_100002 num 2 1 stock 2 no 
id_100002 num 2 1 stock 2 no 
id_100002 num 2 1 stock 2 no 
id_100003 num 2 1 stock 2 no 
id_100003 num 2 1 stock 2 no 
1

に思えます。たとえば、

df1 <- data.frame(
    col_id = c("id_100", "id_10002", "id_10003"), 
    stock = c("stock 2"), 
    ch2 = c("yes", "no", "no") 
) 

df2 <- data.frame(
    col_id = c(rep("id_100", 3), 
      rep("id_10002", 3), 
      rep("id_10003", 2)), 
    num = c("num 2"), 
    cat1 = c(0, 1, 0, 1, 1, 1, 1, 1) 
) 

mergedData <- merge(df1, df2, all.y = TRUE) 

は、貼り付けたスニペットに基づいて出力を生成します。適切な結合(インナー、アウター、左、右、何でも)を達成したいall.(x|y) = (TRUE|FALSE)の任意の組み合わせを使用できます。 W3 Schoolsには、さまざまなタイプの結合(SQLのコンテキストで話していますが、Rのmerge関数も同様です)の説明があります。

1

あなただけ

df$stock=rep('stock2',8) 
    df$ch2[df$col_id %in% c('id_100,num','id_100002','id_100003']=c('yes','no','no') 

の下にこれはあなたの問題に対処できるようコードの2行を追加する必要があります。

関連する問題