2011-07-06 1 views
1
une

Je DF1 comme ceci:R: cbind basé sur premier match quelques lettres ou le nombre de cellules

df1 <- data.frame(A=c("x01","x02","y03","z02","x04"), B=c("A01BB01","A02BB02","C02AA05","B04CC10","C01GX02")) 

    A  B 
1 x01 A01BB01 
2 x02 A02BB02 
3 y03 C02AA05 
4 z02 B04CC10 
5 x04 C01GX02 

Je DF2 comme ça.

X  Y 
1 a A01BB 
2 b A02 
3 c C02A 
4 d B04 
5 e C01GX 

df2 <- data.frame(X=c("a","b","c","d","e"), Y=c("A01BB","A02","C02A","B04","C01GX")) 

Je veux faire correspondre les premières lettres/chiffres dans DF1 $ B avec ceux DF2 $ Y. Et puis fusionner deux dataframe basé sur la meilleure correspondance, en tant que tel, nous nous attendons à un résultat trame de données comme ceci:

A  B X  Y 
1 x01 A01BB01 a A01BB 
2 x02 A02BB02 b A02 
3 y03 C02AA05 c C02A 
4 z02 B04CC10 d B04 
5 x04 C01GX02 e C01GX 

Pourriez-vous l'esprit de me apprendre comment le faire? Merci. La correspondance ne peut se produire que dans les premières lettres/chiffres, la partie correspondante ne peut pas apparaître au milieu ou à la fin des mots dans df1 $ B, y a-t-il un moyen efficace de le faire avec R?

Répondre

0

Vous pouvez utiliser pmatch pour ce genre de correspondance:

with(c(df1,df2),{ 
    i <- pmatch(Y,B) 
    data.frame(A,B,X = X[i],Y = Y[i]) 
}) 
+0

Merci. Pourriez-vous m'apprendre à modifier votre code quand df1 et df2 ont un numéro différent. de rangées? Où il peut également permettre l'appariement de se produire plus d'une fois, chaque fois, aucune correspondance, «NA» devrait être donnée? – user2718

+0

Je ne suis pas sûr de comprendre votre question - essayez de remplacer 'data.frame' par' list' dans l'exemple de code ci-dessus – nullglob

+0

Désolé de ne pas avoir donné suffisamment de détails dans cette question. J'ai modifié et posté une question détaillée modifiée comme suit. S'il vous plaît veuillez donner vos commentaires. @nullglob – user2718

Questions connexes