yamazaki Still just a rat in a cage? | Bonjour, et désolé si le sujet existe / un topic unique existe / je suis pas dans la bonne catégorie, et merci de me rediriger le cas échéant (R, c'est pas facile à rechercher!...)
Avant toute explication, la question : Comment ajouter une valeur en début de liste à chacune des listes d'un vecteur contenant X listes?
J'ai un fichier que me pond un programme qui trace des cellules mobiles observées par une caméra. Le fichier de sortie est un csv et comprend 5 colonnes: track, Time, X, Y, Z.
Ce fichier présente donc le tracage, dans un seul fichier, de plusieurs cellules dont la position au temps T est donnée par ses coordonnées X,Y. Dans un fichier, j'ai donc toutes une séries de données pour le track1, pour le track2, etc. Ce nombre de track peut atteindre un nombre assez élevé. Peu de fichiers à injecter, mais chacun un très grand nombre de tracks. On me demande de faire plusieurs choses, et sous R (d'autres fonctions utilisées plus tard et déjà existantes nécessitent R, merci donc, même si je peux comprendre la base de la réflextion, de ne pas me proposer de bosser plutôt sous Excel).
Je dois calculer une distance nette parcourue. Donc on prend les coordonnées X,Y de la ligne concernée, qu'on compare aux coordonnées du temps0, et on obtient un résultat. Là où j'ai problème, et ca doit pourtant être pas super compliqué, c'est que j'ai X tracks à traiter, et que pour chacun, j'ai n-1 résultats de distance. Or je veux bien sûr créer une colonne avec le résultat de mes calculs, ce qui induit un décalage.
L'idée de base: je commence par splitter mes données en fonction du track, puis j'applique la formule, puis je cherche à ajouter la colonne. J'obtiens:
X1 Y1 D1 (calculée par rapport à Y2-Y1/X2-X1)
X2 Y2 D2 (calculée par rapport à Y3-Y1/X3-X1)
X3 Y3 et là il calcule une valeur D3 en recyclant X2 et Y2 au lieu de s'arréter. Du coup, je lui dis de procéder sur n-1, et j'ai bien le bon nombre de distances calculées.
J'obtiens donc x listes correspondant à N tracks, chacune faisant n-1 lignes que le track dont elle est issue.
Quelque part entre ces 3 étapes, il faudrait que je rajoute un NA avoir le même nombre de valeur dans la colonne que je rajoute que dans celle des données de base, sinon il se crée un décalage. Et puisque je suis embettant, je voudait que ce NA soit en première ligne (vu que c'est la ligne de référence, par rapport à laquelle le reste est calculé).
Je veux donc :
X1 Y1 NA
X2 Y2 D1 (calculée par rapport à Y2-Y1/X2-X1)
X3 Y3 D2 (calculée par rapport à Y3-Y1/X3-X1)
Voici mon script:
Citation :
##Rename Data
t1<- trackdata2
## Computing the NetDistance (ND)
## Split the data
dfs <- split(t1,t1$track)
## calculation
NDtemp1 <- sapply( dfs , function(x) dist( x[,c("X","Y" )] , diag = TRUE)
[1:nrow(x)-1], simplify = TRUE, USE.NAMES = TRUE )
## Convert to usable data and append to dataset
NDtemp2<-unsplit(NDtemp1, t1$track)
ND=as.matrix(NDtemp2)
NM1<-cbind(t1, ND)
## NetDistanceSquared (ND^2)
ND2=ND*ND
newmatrix<-cbind(NM1, ND2)
## Export completed dataset
write.table(newmatrix, "dpath/newmatrix.txt", sep="\t" )
|
Au moment du cbind, j'ai autant de warnings que de tracks, car il manque une valeur pour chacun, qui est remplacée par un 0, mais en fin de liste. Il me faut au pire un 0 en début de liste pour chaque track, au mieux un NA.
Comment ajouter une valeur, à chacun de mes track, en début de track, pour avoir un vecteur aussi long que celui de base?
J'espère avoir été clair, mais c'est pas gagné...
Merci d'avance. |