2012-01-06 4 views
2

J'ai un problème ....colonnes Fusion de différentes trames de données

J'ai deux trames de données

>anna1 
    name from  to  result 
    11  66607  66841  0 
    11  66846  67048  0 
    11  67053  67404  0 
    11  67409  68216  0 
    11  68221  68786  0 
    11  68791  69020  0 
    11  69025  69289  0 
    11  69294  70167  0 
    11  70172  70560  0 

et la seconde trame de données est

>anna2 
    name from  to  result 
    11  66607  66841  5 
    11  66846  67048  6 
    11  67409  68216  7 
    11  69025  69289  12 
    11  70172  70560  45 

Ce que je veux pour créer une nouvelle trame de données similaire à l'anna1 où toutes les valeurs 0 seront remplacées par les résultats corrects dans la rangée correcte de l'anna2

vous remarquerez que dans la trame de données anna2, dans les colonnes from et to ont seulement quelques mêmes valeurs avec les respectifs dans la trame de données anna1 .... les intermédiaires sont manquants

Donc j'ai besoin d'une certaine façon de prendre les chiffres de la colonne de résultat dans la anna2 et les mettre dans la ligne correcte dans le anna1 merci

à l'avance

Meilleures salutations Anna

Répondre

1

Si la colonne « de » est garanti être unique à la fois dans anna1 et anna2, ET jamais ligne y en anna2 a une ligne correspondante dans anna1 (mais pas vice-versa), une solution simple est

row.index = function(d) which(anna1$from == d)[1] 
indices = sapply(anna2$from, row.index) 
anna1$result[indices] = anna2$result 
+0

Dans le cadre de données anna2 les valeurs dans les colonnes de et sont les mêmes avec le valuse dans anna2. Le problème est que dans l'anna2 les valeurs sont un sous-ensemble de anna1 donc ... j'ai juste besoin de faire correspondre et remplacer le 0 par les valeurs des résultats de anna2 dans les résultats de anna1 dans la ligne correcte – Anna

+0

Voulez-vous dire "même avec les valeurs dans anna1"? Et je pense que vous pourriez me comprendre. Mais "unique", je veux dire que vous n'avez jamais un cas où la même valeur apparaît deux fois dans anna1. –

+0

Avez-vous essayé ma solution? D'après ce que vous dites, je pense que cela devrait fonctionner. Si cela ne fonctionne pas, soyez précis quant à la façon dont cela ne fonctionne pas. –

0

Vous pouvez utiliser merge, mais vous devez spécifier explicitement ce qu'il faut faire avec les deux colonnes result.

d <- merge(anna1, anna2, by=c("name", "from", "to"), all=TRUE) 
d$result <- ifelse(d$result.x == 0 & !is.na(d$result.y), d$result.y, d$result.x) 
d <- d[,c("name", "from", "to", "result")] 
+0

Pouvez-vous m'aider avec cette question: [http://stackoverflow.com/questions/35484595/data-frame-merge-and-selection-of-values-which-are-common-in-2-data -cadres] – user3253470

2

Une simple merge:

anna3 <-merge(anna2,anna1[,1:3], all.y=TRUE) 
anna3[is.na(anna3)] <- 0 

donne:

> anna3 
    name from to result 
1 11 66607 66841  5 
2 11 66846 67048  6 
3 11 67053 67404  0 
4 11 67409 68216  7 
5 11 68221 68786  0 
6 11 68791 69020  0 
7 11 69025 69289  12 
8 11 69294 70167  0 
9 11 70172 70560  45 
1

Une autre approche

require(plyr) 
anna <- rbind(anna1, anna2) 
ddply(anna, .(name, from, to), summarize, result = sum(result)) 

EDIT. Si les trames de données sont grandes, et la vitesse est un problème, pensez à utiliser data.table

require(data.table) 
data.table(anna)[,list(result = sum(result)),'name, from, to'] 
Questions connexes