2016-06-28 26 views
-1

内の行数が異なる2つのデータフレームを組み合わせる:私は2つのデータフレーム、リンクと体を持っているR

リンクは、このようなものです:

wpt fuel distance 
1  2221 53927 
2  4821 48261 
3  8362 47151 

wpt  ID 
1   1235 
mediate 4562 
mediate 0928 
2   6351 
3   3826 
mediate 0835 

体は、このようなものです

出力は次のようになります。

wpt  fuel distance ID 
1  2221 53927  1235 
mediate NA  NA   4562 
mediate NA  NA   0928 
2  4821 48261  6351 
3  8362 47151  3826 
mediate NA  NA   0835 

私は "マージ"機能を使用しようとしましたがうまくいきませんでした。 "mediate"の行番号をインデックスとして使用して "body"を分割し、1つ1つずつrbindすれば動作すると仮定します。もっと良い方法がありますか?誰かがここで助けてくれるのを見ます

ありがとうございます!

+1

merge'が動作しない '場合、それは典型的に思えるので、私は再びそれをしようとするだろう私に「合併」問題。 – Psidom

+0

'merge(link、body、all = TRUE)' – alistaire

+0

私はそうは思わない、私は正確に同じ位置に "mediate"を持つ行をしたい。マージは自動的にそれらをまとめます。 –

答えて

2
df1 <- data.frame(wpt = c(1, "meditate", "meditate", 2,3,"meditate"), 
       ID = c(1235, 4562, 0928,6351,3826,0835)) 
df1$wpt <- as.character(df1$wpt) 


df2 <- data.frame(wpt = c(1,2,3), 
       fuel = c(1235, 4562, 0928), 
       distance = c(2,3,4)) 
df2$wpt <- as.character(df2$wpt) 


library(dplyr) 
full_join(df1, df2, by = "wpt") 

値を気にしないでください!いつでも列を並べ替えることができます。

 wpt ID fuel distance 
1  1 1235 1235  2 
2 meditate 4562 NA  NA 
3 meditate 928 NA  NA 
4  2 6351 4562  3 
5  3 3826 928  4 
6 meditate 835 NA  NA 
+0

私は、質問に示されているように正確な位置に "mediate"の行を付けることを思い出させることを思い出させる。または、これは単にマージ関数で行うことができます。 –

+0

私の編集を確認してください。あなたが望むように、瞑想の価値はその位置にあります。 – Sumedh

1

私たちは、私は次のように動作するはずだと思うleft_join

library(dplyr) 
mutate(df2, wpt = as.character(wpt)) %>% 
        left_join(df1, ., by = 'wpt') 
#  wpt ID fuel distance 
#1  1 1235 2221 53927 
#2 mediate 4562 NA  NA 
#3 mediate 928 NA  NA 
#4  2 6351 4821 48261 
#5  3 3826 8362 47151 
#6 mediate 835 NA  NA 

それともdata.table

library(data.table) 
setDT(df2)[, wpt := as.character(wpt)][df1, on = "wpt"] 
#  wpt fuel distance ID 
#1:  1 2221 53927 1235 
#2: mediate NA  NA 4562 
#3: mediate NA  NA 928 
#4:  2 4821 48261 6351 
#5:  3 8362 47151 3826 
#6: mediate NA  NA 835 
+1

入力いただきありがとうございます! –

2

を使用してを使用することができます。

​​
+0

'setkey'は' data.table'関数です。あなたは 'library(data.table)'が必要です – JackeJR

+0

あなたはdata.tableが必要です – Koba

+0

別の方法を知っておいてよかった! –

3

ここmatch()を中心に構築された非マージベースRのソリューションです:

link[names(body)[-1L]] <- body[match(link[,1L],body[,1L]),-1L]; 
link; 
##  wpt ID fuel distance 
## 1  1 1235 2221 53927 
## 2 mediate 4562 NA  NA 
## 3 mediate 0928 NA  NA 
## 4  2 6351 4821 48261 
## 5  3 3826 8362 47151 
## 6 mediate 0835 NA  NA 

は、Data

link <- data.frame(wpt=c('1','mediate','mediate','2','3','mediate'),ID=c('1235','4562','0928' 
,'6351','3826','0835'),stringsAsFactors=F); 
body <- data.frame(wpt=c(1L,2L,3L),fuel=c(2221L,4821L,8362L),distance=c(53927L,48261L,47151L) 
); 
+1

私が示唆できる場合は、この回答を重複ターゲットに移動してください。 – zx8754

関連する問題