2010-02-11 7 views
2

Dire que j'ai une trame de données avec le contenu:Manipuler une trame de données avec le contenu d'une trame de données différentes semblable à un SQL rejoindre

Trial Person Time 
1  John 1.2 
2  John 1.3 
3  John 1.1 
1  Bill 2.3 
2  Bill 2.5 
3  Bill 2.7 

et une autre trame de données avec le contenu:

Person Offset 
John 0.5 
Bill 1.0 

et je veux modifier le cadre d'origine en fonction de la valeur appropriée de la seconde. Je pourrais le faire facilement dans n'importe quelle autre langue ou dans SQL, et je suis sûr que je pourrais gérer l'utilisation de boucles et quoi, mais avec tout ce que je vois dans R, je suppose qu'il a une syntaxe spéciale pour faire cela -doublure. Alors, si oui, comment? Et sinon, pourriez-vous montrer comment cela pourrait être fait en utilisant des boucles. Je n'ai pas encore appris à boucler dans R car il a des choses incroyables pour simplement extraire et manipuler toutes les valeurs.

Pour référence, la sortie:

Trial Person Time 
1  John 0.7 
2  John 0.8 
3  John 0.6 
1  Bill 1.3 
2  Bill 1.5 
3  Bill 1.7 
+0

vous auriez pu utiliser un titre plus spécifique .. – dalloliogm

+0

@dalloliogm Sentez-vous libre pour lancer une recommandation .... J'ai eu la réponse dont j'avais besoin dans les dix minutes –

+0

oui mais parce que le titre était si général que les gens l'ont regardé juste pour mieux comprendre ce que c'était. Vous avez donc enlevé l'attention à d'autres questions qui étaient peut-être mieux écrites, et c'est injuste. Un bon titre devrait être de sorte que l'on puisse avoir une idée de ce que vous allez demander juste en le lisant. De toute façon, la paix, tu n'as rien fait de trop terrible, ça va. – dalloliogm

Répondre

5

Il y a beaucoup de possibilités. Voici un simple en utilisant merge() et d'une simple soustraction sage colonne dans la data.frame élargie:

R> DF1 <- data.frame(trial=rep(1:3,2), \ 
        Person=rep(c("John","Bill"), each=3), \ 
        Time=c(1.2,1.3,1.1,2.3,2.5,2.7)) 
R> DF2 <- data.frame(Person=c("John","Bill"), Offset=c(0.5,1.0)) 
R> DF <- merge(DF1, DF2) 
R> DF 
    Person trial Time Offset 
1 Bill  1 2.3 1.0 
2 Bill  2 2.5 1.0 
3 Bill  3 2.7 1.0 
4 John  1 1.2 0.5 
5 John  2 1.3 0.5 
6 John  3 1.1 0.5 
R> DF$NewTime <- DF$Time - DF$Offset 
R> DF 
    Person trial Time Offset NewTime 
1 Bill  1 2.3 1.0  1.3 
2 Bill  2 2.5 1.0  1.5 
3 Bill  3 2.7 1.0  1.7 
4 John  1 1.2 0.5  0.7 
5 John  2 1.3 0.5  0.8 
6 John  3 1.1 0.5  0.6 
R> 
+0

Ha! Je viens de trouver un one-liner en utilisant une boucle for, mais c'est encore plus beau. Je ne me suis pas rendu compte que vous pouviez fusionner deux images, et cela va déterminer où elles vont en fonction des noms des colonnes. –

1

Une doublure:

transform(merge(d1,d2), Time=Time - Offset, Offset=NULL) 
Questions connexes