2016-06-28 7 views
0

Ich habe eine vapply-Funktion, die eine Matrix der Renditen mit Daten von Google Maps erstellt. Wenn die Funktion mit der Geocode-Rückgabe von nur einer Adresse arbeitet, erzwingt vapply die Matrix auf einen einfachen Zeichenvektor der Länge 4. Wenn mehr als eine Adresse verarbeitet wird, wird eine Matrix mit n-Werten entsprechend der Anzahl der codierten Adressen zurückgegeben. Ein einfaches Beispiel folgt. Ich habe unten eine Lösung, aber es erscheint mir als ein uneleganter Pfad, um die gewünschte Ausgabe zu erreichen, nämlich einen Datenrahmen mit benannten Spalten. Ich frage mich auch, ob dies mich durch diesen Ansatz für Käfer öffnet. Gibt es eine bessere Möglichkeit, einen Datenrahmen mit diesen sich ändernden Zeicheneingaben flexibel zu erstellen?Arbeiten mit Matrix vs. Zeichen Vektor kehrt von vapply

# Save a dummy URL 
geocode_url <- "https://www.google.com" 

# Example: one row character return from vapply where matrix is coerced to character vector. 
coord <- c(NA, NA, NA, "ZERO_RESULTS") 

# Example: matrix return from vapply 
coord <- matrix(c(NA, NA, NA, "ZERO_RESULTS", 
         NA, NA, NA, "ZERO_RESULTS", 
         NA, NA, NA, "ZERO_RESULTS"), 
         ncol=4, nrow=3, byrow=T) 

if(is.matrix(coord)){ 
    out <- data.frame(input_url=geocode_url, 
         lat=as.numeric(coord[ , 1]), 
         lng=as.numeric(coord[ , 2]), 
         location_type=coord[ , 3], 
         status=coord[ , 4]) 
} else if(length(coord)==4){ 
    out <- data.frame(input_url=geocode_url, 
         lat=as.numeric(coord[1]), 
         lng=as.numeric(coord[2]), 
         location_type=coord[3], 
         status=coord[4]) 
} 

Antwort

0

Ist das wonach Sie suchen?

if(is.matrix(coord)){ 
    out <- as.data.frame(coord) 
} else if(length(coord)==4) { 
    out <- data.frame(t(unlist(coord))) 
} 

colnames(out) <- c("lat", "lang", "location_type", "status") 
out$input_url <- geocode_url 
out <- out[,c(5,1:4)] 
out[,c(2,3)] <- lapply(out[,c(2,3)], as.numeric)