2016-04-24 21 views
0

DF2に基づいてDF1にインデックスを作成しようとしています。 DF2にはIDという名前の列があります.DF1 $ Nameを検索し、DF2 $ Wineの値が入っていればDF2 $ IDからDF1 $ IDにIDを入力します。別のデータフレームに基づいてデータフレームにインデックスを作成する方法R

DF1 = allwines

a <- c("Malbec", "Syrah", "Cabernet Sauvignon", "Merlot") 
b <- c(1, 2, 3, 4) 
allwines <- data.frame(a, b) 

> allwines 
        a b 
1    Malbec 1 
2    Syrah 2 
3 Cabernet Sauvignon 3 
4    Merlot 4 

DF2 =ワイン

c <- c("Charles Smith", "K Vintners", "K Vintners", "Two Vintners", "K Vintners", "Kerloo", "Betz Family", "Efeste") 
d <- c("Royal City Syrah", "Cattle King Syrah", "Klein Syrah", "Make Haste Cinsault", "The Hidden Syrah", "Stone Tree Malbec", "Le Parrain Cabernet Sauvignon", "Big Papa Cabernet Sauvignon") 
wines <- data.frame(c, d) 

> wines 
       c        d 
1 Charles Smith    Royal City Syrah 
2 K Vintners    Cattle King Syrah 
3 K Vintners     Klein Syrah 
4 Two Vintners   Make Haste Cinsault 
5 K Vintners    The Hidden Syrah 
6  Kerloo    Stone Tree Malbec 
7 Betz Family Le Parrain Cabernet Sauvignon 
8  Efeste Big Papa Cabernet Sauvignon 

所望の出力

> desired 
       c        d ID 
1 Charles Smith    Royal City Syrah 2 
2 K Vintners    Cattle King Syrah 2 
3 K Vintners     Klein Syrah 2 
4 Two Vintners   Make Haste Cinsault NA 
5 K Vintners    The Hidden Syrah 2 
6  Kerloo    Stone Tree Malbec 1 
7 Betz Family Le Parrain Cabernet Sauvignon 3 
8  Efeste Big Papa Cabernet Sauvignon 3 

私の試みはわずかNAの完全なID列を生成してきました。 アイデアは、ワインの列にあるワインの名前を検索して、すべてのワインのワインと一致させることです。たとえば、オールワインのシラーはRoyal City Syrah、Cattle King Syrah、Klein Syrahとワインを合わせます$

+0

あなたのデータで、 'sum(unique(df1 $ Name)%in%unique(df2 $ Wine))'はゼロを与えます。したがって、結合/マージするための一致する行を見つけることは期待されていません。代わりに、 'intersect(unique(df1 $ Name)、unique(df2 $ Wine))'は空ベクトルを与えます。 – Gopala

+0

'DF2 $ Wine'のいくつかが' DF1 $ Name'sと実際に一致するようにデータフレームを変更できますか? – rawr

+0

'idx < - sapply(DF2 $ Wine、function(x)DF1 $ Name [grep(x、DF1 $ Name、ignore.case = TRUE)]);を試してみてください。 DF1 $ ID < - DF2 $ ID [一致(名前(idx [match(DF1 $ Name、idx)])、DF2 $ Wine)] 'おそらく。私はいくつかのテストケースを作ったが、それは大丈夫だと思われる。 – rawr

答えて

0

名前がdf2 $ Wineとdf1 $ Nameの間で正確に一致する場合は、それらの列に単純に参加して、必要なものを得ることができます。あなたはすべてのNASのリストを作成する前に

、これを試してみてください。それはDF2に発見された場合

library(dplyr) 
newdf <- left_join(df1, df2, by = c('Name', 'Wine')) 

newdfは今、DF1から元のすべての行、および対応するIDを含める必要があります。

もちろん、すべてが正しくフォーマットされていて、名前が一致していることを前提としています。

+0

私は正確なマッチを探していません。ワイン$ Name **に** allwines $ Wineが含まれている場合は、ID番号を入れます。ワイン$ Nameの名前はRoyal City Syrahのようにユニークなので、私はそれをallwines $のSyrahと一致させたいと思いますワイン。 –

+0

これを反映するために質問を編集できますか?また、おそらく出力が期待される例を提供することは助けになります(現在のケースでは類似点はありません)。 –

関連する問題