2017-09-05 10 views
0

중첩 목록에서 변환 된 지오 코딩 된 모스크바 거리 주소의 중첩 목록이 있습니다. 그러나 내가 지오 코딩 한 데이터 프레임에는 우편 번호가없는 주소 만 있었으며 몇 백 (33k)의 경우 주소에서 다른 우편 번호가있는 동일한 주소에 대해 여러 결과가 반환되었습니다. 이로 인해 목록에 추가 중첩이 생성되었습니다.이 중첩은 데이터 프레임으로 변환 될 때 초기 데이터 프레임과 다른 수의 관측 결과를 생성합니다.변수 중첩 수준의 목록을 병합하면 추가 관측이 생성됩니다.

하나의 어드레스와 결과 구조는 다음 :

structure(list(results = structure(list(address_components = list(
    structure(list(long_name = c("23", "óëèöà Áîëüøàÿ Àêàäåìè÷åñêàÿ", 
    "Ñåâåðíûé àäìèíèñòðàòèâíûé îêðóã", "Ìîñêâà", "Ìîñêâà", "Ðîññèÿ", 
    "127299"), short_name = c("23", "óë. Áîëüøàÿ Àêàäåìè÷åñêàÿ", 
    "Ñåâåðíûé àäìèíèñòðàòèâíûé îêðóã", "Ìîñêâà", "Ìîñêâà", "RU", 
    "127299"), types = list("street_number", "route", c("political", 
    "sublocality", "sublocality_level_1"), c("locality", "political" 
    ), c("administrative_area_level_2", "political"), c("country", 
    "political"), "postal_code")), .Names = c("long_name", "short_name", 
    "types"), class = "data.frame", row.names = c(NA, 7L)), structure(list(
     long_name = c("23", "óëèöà Áîëüøàÿ Àêàäåìè÷åñêàÿ", "Ñåâåðíûé àäìèíèñòðàòèâíûé îêðóã", 
     "Ìîñêâà", "Ìîñêâà", "Ðîññèÿ", "125008"), short_name = c("23", 
     "óë. Áîëüøàÿ Àêàäåìè÷åñêàÿ", "Ñåâåðíûé àäìèíèñòðàòèâíûé îêðóã", 
     "Ìîñêâà", "Ìîñêâà", "RU", "125008"), types = list("street_number", 
      "route", c("political", "sublocality", "sublocality_level_1" 
      ), c("locality", "political"), c("administrative_area_level_2", 
      "political"), c("country", "political"), "postal_code")), .Names = c("long_name", 
    "short_name", "types"), class = "data.frame", row.names = c(NA, 
    7L))), formatted_address = c("óë. Áîëüøàÿ Àêàäåìè÷åñêàÿ, 23, Ìîñêâà, Ðîññèÿ, 127299", 
"óë. Áîëüøàÿ Àêàäåìè÷åñêàÿ, 23, Ìîñêâà, Ðîññèÿ, 125008"), geometry = structure(list(
    location = structure(list(lat = c(55.8169112, 55.826859), 
     lng = c(37.5202899, 37.529427)), .Names = c("lat", "lng" 
    ), class = "data.frame", row.names = 1:2), location_type = c("ROOFTOP", 
    "ROOFTOP"), viewport = structure(list(northeast = structure(list(
     lat = c(55.8182601802915, 55.8282079802915), lng = c(37.5216388802915, 
     37.5307759802915)), .Names = c("lat", "lng"), class = "data.frame", row.names = 1:2), 
     southwest = structure(list(lat = c(55.8155622197085, 
     55.8255100197085), lng = c(37.5189409197085, 37.5280780197085 
     )), .Names = c("lat", "lng"), class = "data.frame", row.names = 1:2)), .Names = c("northeast", 
    "southwest"), class = "data.frame", row.names = 1:2)), .Names = c("location", 
"location_type", "viewport"), class = "data.frame", row.names = 1:2), 
    partial_match = c(TRUE, TRUE), place_id = c("ChIJnVMw7C1ItUYRdfeWEQrXuAk", 
    "ChIJnbnwOdY3tUYR1_D9pHTqCsI"), types = list("street_address", 
     "street_address")), .Names = c("address_components", 
"formatted_address", "geometry", "partial_match", "place_id", 
"types"), class = "data.frame", row.names = 1:2), status = "OK"), .Names = c("results", 
"status")) 
: 여러 개의 주소와 이에 반해

structure(list(results = structure(list(address_components = list(
    structure(list(long_name = c("4", "óëèöà Áîëüøàÿ Àêàäåìè÷åñêàÿ", 
    "Ñåâåðíûé àäìèíèñòðàòèâíûé îêðóã", "Ìîñêâà", "Ìîñêâà", "Ðîññèÿ", 
    "127299"), short_name = c("4", "óë. Áîëüøàÿ Àêàäåìè÷åñêàÿ", 
    "Ñåâåðíûé àäìèíèñòðàòèâíûé îêðóã", "Ìîñêâà", "Ìîñêâà", "RU", 
    "127299"), types = list("street_number", "route", c("political", 
    "sublocality", "sublocality_level_1"), c("locality", "political" 
    ), c("administrative_area_level_2", "political"), c("country", 
    "political"), "postal_code")), .Names = c("long_name", "short_name", 
    "types"), class = "data.frame", row.names = c(NA, 7L))), 
    formatted_address = "óë. Áîëüøàÿ Àêàäåìè÷åñêàÿ, 4, Ìîñêâà, Ðîññèÿ, 127299", 
    geometry = structure(list(location = structure(list(lat = 55.8176896, 
     lng = 37.522891), .Names = c("lat", "lng"), class = "data.frame", row.names = 1L), 
     location_type = "ROOFTOP", viewport = structure(list(
      northeast = structure(list(lat = 55.8190385802915, 
       lng = 37.5242399802915), .Names = c("lat", "lng" 
      ), class = "data.frame", row.names = 1L), southwest = structure(list(
       lat = 55.8163406197085, lng = 37.5215420197085), .Names = c("lat", 
      "lng"), class = "data.frame", row.names = 1L)), .Names = c("northeast", 
     "southwest"), class = "data.frame", row.names = 1L)), .Names = c("location", 
    "location_type", "viewport"), class = "data.frame", row.names = 1L), 
    partial_match = TRUE, place_id = "ChIJ59yLsy1ItUYR5EEBFbFJoSA", 
    types = list("street_address")), .Names = c("address_components", 
"formatted_address", "geometry", "partial_match", "place_id", 
"types"), class = "data.frame", row.names = 1L), status = "OK"), .Names = c("results", 
"status")) 

모습 (R 콘솔 올바르게 키릴를 무의미한 무시 렌더링하지 않음)

두 번째 목록의 결과 요소에는 각 가능한 주소에 대해 추가 수준의 중첩이 있습니다.이 수준은 병합 할 때 해당 주소에 대한 "추가"관찰을 만들어서 cbind() 지오 코딩 결과가 주소 목록으로 돌아갑니다. 내 중첩 목록을 데이터 프레임에 병합하려면 다음 함수를 사용하고 있습니다. 이 추가 중첩이 발생할 때 첫 번째 주소 만 가져 오도록 수정하려면 어떻게해야합니까? 주소가 정확하지 않으면 나중에 다른 데이터 프레임과 병합 할 때 샘플이 건물에서 버려지기 때문에 원래의 데이터 프레임 (주소의 원본)에있는 해당 행과 일치하는 각 지오 코딩 된 관측치 만 작성하면됩니다.

flatten_googleway <- function(df) { 
    require(jsonlite) 
    res <- jsonlite::flatten(df) 
    res[, names(res) %in% c("geometry.location_type", "geometry.location.lat", 
          "geometry.location.lng", "formatted_address")] 
} 
moscowhousegeo.df <- do.call(rbind, lapply(moscowhouse.list, function(x) { 
    if (length(x$results) == 0) template_res[1, ] else flatten_googleway(x$results) 
})) 

##template for NA results 
structure(list(formatted_address = character(0), geometry.location_type = character(0), 
    geometry.location.lat = numeric(0), geometry.location.lng = numeric(0)), .Names = c("formatted_address", 
"geometry.location_type", "geometry.location.lat", "geometry.location.lng" 
), row.names = integer(0), class = "data.frame") 

답변

0

어쨌든, 평소와 같이 나는 너무 복잡했습니다. 나는 간단히 lapply() 호출을 수정하여 모든 목록 요소를 결과없이 바꾸고 요소는 x$results$address_components이 길이 1보다 큽니다 (가능한 여러 결과가 반환되는 경우).

moscowhousegeo.df <- do.call(rbind, lapply(moscowhouse.list, function(x) { 
    if (length(x$results) == 0 | length(x$results$formatted_address) > 1) template_res[1, ] else flatten_googleway(x$results) 
})) 

나는 여전히이 방법 불행하게도 일부 데이터가 손실 될 수 있지만, 어떤 주소를 식별하는 것 너무 많은 시간이 소요 될 주어진 선택의 여지가 정확하고 많은 관찰과 데이터 집합에 조금 바보.