2011-05-27 4 views
0

J'ai une grande data.frame avec des noms de lieux géographiques (mydata). Les emplacements apparaissent dans le data.frame dans plusieurs cellules.Manipulation d'une trame de données avec le contenu d'une autre trame de données

Dans un autre fichier avec 3 colonnes, j'ai tous ces endroits (première colonne), la latitude de ces endroits (en second lieu les endroits apparaissent dans le data.frame dans plus d'une cellule). Dans un autre fichier avec 3 colonnes, j'ai tous ces endroits (première colonne), la latitude de ces lieux (deuxième colonne) et la longitude dans la troisième colonne.

Je veux créer deux autres matrices (Lat et Long) avec dimension égale à la dimension du data.frame avec les lieux géographiques tels que:

Lat[i,j] = Latitude of the place in mydata[i,j] 
long[i,j]= longitude of the place in mydata[i,j] 

Je suis donc à la recherche d'une procédure qui traversent mydata, choisissez le nom de l'endroit dans chaque cellule, recherchez la latitude et la longitude dans le deuxième fichier et remplissez ces valeurs dans les matrices Lat et Long.

mydata <- data.frame(cbind(c("xyz","ab","yabc",NA)), 
          c("xyz","xyz","yabc","ab")), 
          c("ab","ab",NA,"yabc"))) 
Coor <- data.frame(cbind(c("ab","xyz","yabc"), 
          c(31.34,42.15,36.98), 
          c(12.87,13.67,18.56))) 

Je veux une méthode pour obtenir

Lat <- data.frame(cbind(c(42.15,31.34,36.98,NA), 
         c(42.15,42.15,36.98,31.34), 
         c(31.34,31.34,NA,36.98))) 

Répondre

2

Quelque chose comme ceci:

Lat<-do.call(cbind, lapply(mydata, function(curcol){ Coor[match(curcol, Coor[,1]), 2] })) 

Ce OK?

+0

cela fonctionne parfaitement, merci beaucoup – Ramon

1

Voici une procédure simple qui produit ce que vous voulez. Il peut y avoir un moyen de le faire sans une boucle explicite for en utilisant *apply et des index, mais cela est lisible.

#Define columns explicitly, avoiding cbind and the resulting coercion to characters 
mydata <- data.frame(X1=c("xyz","ab","yabc",NA),X2= c("xyz","xyz","yabc","ab"), X3=c("ab","ab",NA,"yabc")) 
Coor <- data.frame(X1=c("ab","xyz","yabc"),X2=c(31.34,42.15,36.98),X3=c(12.87,13.67,18.56)) 

Lat <- data.frame(cbind(c(42.15,31.34,36.98,NA),c(42.15,42.15,36.98,31.34),c(31.34,31.34,NA,36.98))) 

#Create the new lat/long matrices to hold the result 
Lat1 <- matrix(NA,nrow=nrow(mydata),ncol=ncol(mydata)) 
Long1 <- matrix(NA,nrow=nrow(mydata),ncol=ncol(mydata)) 

for (i in 1:ncol(mydata)){ 
    Lat1[,i] <- Coor[match(mydata[,i],Coor$X1),2] 
    Long1[,i] <- Coor[match(mydata[,i],Coor$X1),3] 
} 

En comparant votre sortie désirée:

Lat 
    X1 X2 X3 
1 42.15 42.15 31.34 
2 31.34 42.15 31.34 
3 36.98 36.98 NA 
4 NA 31.34 36.98 

Lat1 
     [,1] [,2] [,3] 
[1,] 42.15 42.15 31.34 
[2,] 31.34 42.15 31.34 
[3,] 36.98 36.98 NA 
[4,] NA 31.34 36.98 

Et voici ce produit cette solution dans Long1:

Long1 
     [,1] [,2] [,3] 
[1,] 13.67 13.67 12.87 
[2,] 12.87 13.67 12.87 
[3,] 18.56 18.56 NA 
[4,] NA 12.87 18.56 
Questions connexes