2010-12-08 27 views
1

J'ai la question suivante:Colonnes de correspondance, création de boucle dans R

J'ai une trame de données qui ressemble à ceci. J'ai des prix, 3 X et 2 R.

Date Name Price Interest 
01.02.10 X 120  0.2 
01.02.10 R 120  0.3 
01.02.10 X 130  0.8 
01.02.10 X 140  0.4 
01.02.10 R 130  0.2 
etc. 

Je voudrais dire R à rechercher des paires de X & Rs avec le même prix, et supprimer le reste. Donc cela devrait aboutir: 2 X et 2'R (dans ce cas).

Date Name Price Interest 
01.02.10 X 120  0.2 
01.02.10 R 120  0.3 
01.02.10 X 130  0.8 
01.02.10 R 130  0.2 
etc. 

Pour le rendre plus clair (j'espère): J'ai beaucoup de prix différents pour chaque date. Chaque rangée contient un X ou un R. Il y a beaucoup de paires à chaque date, par exemple X, Prix = 120 & R, Prix = 120 à la Date 1. Mais il y a aussi des Prix qui ne correspondent qu'à un Nom, par exemple il y a un Prix = 140 seulement pour Nom = X. Donc ce que je voudrais faire, c'est: vérifier les noms de machting pour un prix (c'est-à-dire qu'il existe le même prix pour un X et un R) et supprimer le reste. Ce qui en résulterait, c'est le même nombre de X et de R parce que je cherche des paires.

Je suis désolé de ne pas pouvoir poster quelque chose que j'ai essayé. Je ne pouvais tout simplement pas penser à quoi que ce soit.

Maintenant, au prochain problème: Si les paires sont là, je voudrais dire à R de vérifier chaque ligne. Si le nom est X, je veux qu'il calcule un nouveau prix, sinon imprimez simplement le prix existant. J'ai essayé

xx <- if(Name == "X"){Price + 100*interest} else print{Price} 

mais cela n'a pas fonctionné.

Merci pour l'aide

Vive Dani

+0

Vous devez mieux expliquer la logique de la première partie. "Rechercher des paires de Nom et Prix" n'a aucun sens pour moi. Pour la deuxième partie, vous pouvez utiliser 'ifelse()' au lieu de 'if() ... else', puisque le premier est vectorisé. – Shane

+0

Ok merci. Je voudrais rechercher des correspondances pour les prix et les noms. J'ai donc beaucoup de dates dans mon cadre de données, qui ont soit le nom X ou R. Pour chaque date, j'ai aussi des observations de prix. Maintenant, pour chaque date, il devrait y avoir exactement sur la paire de X et R pour un prix, par ex. Date 1, x, prix = 120 et Date 1, r, prix = 120. Il y a d'autres observations qui ne correspondent pas, par exemple Date 1, x, prix = 140 alors qu'il y a NO Date 1, r, prix = 140. Je voudrais dire à R de vérifier les correspondances (c.-à-d. X & R avec le même prix à chaque date) et supprimer le reste. Est-ce plus clair maintenant? Merci Shane – Dani

+0

Cela en fait un problème de fusion. Vous "fusionnez" sur Date et Nom, puis comparez (test d'égalité) x.Prix et y.Prix. –

Répondre

0

Edit: @ commentaire de Dwin à la Q était un peu cryptique, et voyant que ma première tentative de la partie 1 du Q n'a pas été correcte en raison de le Q incertain, je vais essayer de me racheter en développant le commentaire de DWin:

[En supposant que dat contient les données que vous citez dans la Q.] Tout d'abord, la fusion dat avec lui-même:

> foo <- merge(dat[, -4], dat, by.x = "Date", by.y = "Date") 
> head(foo) 
     Date Name.x Price.x Name.y Price.y Interest 
1 01.02.10  X  120  X  120  0.2 
2 01.02.10  X  120  R  120  0.2 
3 01.02.10  X  120  X  130  0.2 
4 01.02.10  X  120  X  140  0.2 
5 01.02.10  X  120  R  130  0.2 
6 01.02.10  R  120  X  120  0.2 

Ensuite, sortir les lignes où Price.x == Price.yetName.x != Name.y

> (foo <- foo[with(foo, which(Price.x == Price.y & Name.x != Name.y)),]) 
     Date Name.x Price.x Name.y Price.y Interest 
2 01.02.10  X  120  R  120  0.2 
6 01.02.10  R  120  X  120  0.2 
15 01.02.10  X  130  R  130  0.2 
23 01.02.10  R  130  X  130  0.2 

Puis, se débarrasser des colonnes superflues:

> (foo <- foo[, -(4:5)]) 
     Date Name.x Price.x Interest 
2 01.02.10  X  120  0.2 
6 01.02.10  R  120  0.2 
15 01.02.10  X  130  0.2 
23 01.02.10  R  130  0.2 

Et enfin, corrigez les noms de colonnes:

> names(foo) <- names(dat) 
> foo 
     Date Name Price Interest 
2 01.02.10 X 120  0.2 
6 01.02.10 R 120  0.2 
15 01.02.10 X 130  0.2 
23 01.02.10 R 130  0.2 

La deuxième chose peut être fait en utilisant ifelse

with(dat, ifelse(Name == "X", Price + 100*Interest, Price)) 

Ce qui donne quelque chose cette

> with(dat, ifelse(Name == "X", Price + 100*Interest, Price)) 
[1] 140 120 150 160 130 

La raison pour laquelle le if() ne fonctionne pas, est que if() prendre seulement scalaire logique (un seul TRUE ou FALSE), mais Name == "X" renvoie al vecteur ogique:

> with(dat, Name == "X") 
[1] TRUE FALSE TRUE TRUE FALSE 

Dans ces cas, ifelse() est votre ami.

+0

Salut Gavin! Merci d'avoir répondu. La deuxième partie fonctionne parfaitement. Je suis désolé pour la mauvaise description de la première partie. J'ai accidentellement pris un sous-ensemble de mon dataframe où l'intérêt est réellement égal. Cependant, cela change et n'est pas constant. J'ai essayé unique mais en réalité rien ne se passe. J'ai édité mon premier post pour rendre la première partie plus claire. Bravo Dani – Dani

+0

Gavin, merci beaucoup pour l'explication. – Dani