4

Zillow API から情報を読み取ろうとしていますが、R でデータ構造の問題が発生しています。出力は xml であるはずですが、xml のように動作していません。

特に、GetSearchResults() が返すオブジェクトは XML に似た形式ですが、R の XML 読み取り関数で読み取るには適切ではありません。

これにどのようにアプローチすればよいか教えていただけますか?

#set directory
setwd('[YOUR DIRECTORY]')

# setup libraries
library(dplyr)
library(XML)
library(ZillowR)
library(RCurl)

# setup api key
set_zillow_web_service_id('[YOUR API KEY]')

xml = GetSearchResults(address = '120 East 7th Street', citystatezip = '10009')
data = xmlParse(xml)

これにより、次のエラーがスローされます。

Error: XML content does not seem to be XML

Zillow API のドキュメントには、出力は XML である必要があることが明確に記載されており、確かにそのように見えます。大規模なデータ操作/集計のために、API 出力のさまざまなコンポーネントに簡単にアクセスできるようにしたいと考えています。何かアイデアがあれば教えてください。

4

3 に答える 3

4

これは、Zillow API に慣れる楽しい機会でした。How to parse XML to R data frameに従う私のアプローチは、検査を容易にするために、応答をリストに変換することでした。特に、各プロパティには欠落しているデータがある可能性があるため、リストを調べてデータの構造を把握するのが面倒でした。これがgetValRange、Zestimate データの解析を処理する関数を作成した理由です。

results <- xmlToList(xml$response[["results"]])

getValRange <- function(x, hilo) {
  ifelse(hilo %in% unlist(dimnames(x)), x["text",hilo][[1]], NA)
}

out <- apply(results, MAR=2, function(property) {
  zpid <- property$zpid
  links <- unlist(property$links)
  address <- unlist(property$address)
  z <- property$zestimate
  zestdf <- list(
    amount=ifelse("text" %in% names(z$amount), z$amount$text, NA),
    lastupdated=z$"last-updated",
    valueChange=ifelse(length(z$valueChange)==0, NA, z$valueChange),
    valueLow=getValRange(z$valuationRange, "low"),
    valueHigh=getValRange(z$valuationRange, "high"),
    percentile=z$percentile)  
  list(id=zpid, links, address, zestdf)
})

data <- as.data.frame(do.call(rbind, lapply(out, unlist)), 
  row.names=seq_len(length(out)))

出力例:

> data[,c("id", "street", "zipcode", "amount")]
          id              street zipcode  amount
1 2098001736 120 E 7th St APT 5A   10009 2321224
2 2101731413 120 E 7th St APT 1B   10009 2548390
3 2131798322 120 E 7th St APT 5B   10009 2408860
4 2126480070 120 E 7th St APT 1A   10009 2643454
5 2125360245 120 E 7th St APT 2A   10009 1257602
6 2118428451 120 E 7th St APT 4A   10009    <NA>
7 2125491284 120 E 7th St FRNT 1   10009    <NA>
8 2126626856 120 E 7th St APT 2B   10009 2520587
9 2131542942 120 E 7th St APT 4B   10009 1257676
于 2016-08-07T20:33:55.690 に答える