R-Liste Untergruppen mit „[[ “ , zeigt Fehler subscript out of bounds

Ich versuchte Teilmenge eine große Liste mit 278226 Elemente und jedes element (wie unten gezeigt) ist auch eine Liste, die eine Anzahl(zwischen 39 und 50) der sub-Elemente(Größe 1 atomic vector mit unterschiedlichen Namen).

> str(listings_England[9922])
List of 1
 $ listing:List of 40
  ..$ agent_address       : chr "35 John Street, Luton"
  ..$ agent_logo          : chr "https://st.zoocdn.com/zoopla_static_agent_logo_(257607).png"
  ..$ agent_name          : chr "Ashton Carter Homes"
  ..$ agent_phone         : chr "020 8115 4543"
  ..$ category            : chr "Residential"
  ..$ country             : NULL
  ..$ country_code        : chr "gb"
  ..$ county              : NULL
  ..$ displayable_address : chr "Hatters Way Luton, Luton LU1"
  ..$ first_published_date: chr "2017-11-16 17:25:36"
  ..$ last_published_date : chr "2018-01-29 18:40:52"
  ..$ latitude            : chr "51.88188"
  ..$ listing_id          : chr "39336869"
  ..$ listing_status      : chr "sale"
  ..$ longitude           : chr "-0.43237194"

Dann extrahiere ich die sub-Elemente wie „listing_id“ wie folgt:

> id1 <- sapply(listings_England, "[[", "listing_id")
Error in FUN(X[[i]], ...) : subscript out of bounds
> id3 <- sapply(listings_England[1:100000], "[[", "listing_id")
Error in FUN(X[[i]], ...) : subscript out of bounds
> id2 <- sapply(listings_England[1:50000], "[[", "listing_id")
> 

> listings_England$listing_id
NULL
> 

Wie Sie sehen können, es funktioniert nur für die Letzte (Gleiches problem für die purrr::map Familie von Funktionen). Ich Frage mich, ob es die Einschränkung dieser Funktionen. Und meine aktuelle Lösung ist:

id <- sapply(listings_England, function(x) x["listing_id"]) %>% as.numeric()

Das problem hier ist „[[ „, oder “ $ “ – Funktion funktioniert nicht für diese große Liste, und nur „[“ funktioniert.

  • Wenn es funktioniert für Elemente 1:50000 aber nicht 1:100000 ich Wette, es gibt ein element zwischen der 50000:100000 Bereich, der nicht über eine listing_id Eigenschaft, oder die ganze Sache ist NULL.
  • Ja, du hast Recht! Es ist NULL dieses problem verursacht. Danke!
  • Listen sind nervig, und die großen sind noch schlimmer bc Sie werfen sich seltsame Fehler, die nicht zeigen Sie in die richtige Richtung. Wenn ich kann, ich in der Regel versuchen, Sie zu konvertieren tibbles, sobald ich kann (entweder mit enframe oder bind_rows entweder direkt oder in Kombination mit map).
  • Oh, zwei weitere Anregungen: nur bind_rows(listings_England) sofort, oder vielleicht purrr:discard(listings_England, is.null) fallen NULL Elemente sofort.
InformationsquelleAutor Yunlong Huang | 2018-02-14



4 Replies
  1. 0

    Wenn Sie möchten, konvertieren Sie die listing_id Eintrag zu numerischen, verwenden Sie einfach as.numeric direkt:

    listings_England$listing_id <- as.numeric(listings_England$listing_id)

    sapply ist, was Sie verwenden würden, wenn Sie wollten anwenden einer Funktion auf jedes element in einem Vektor. Aber da as.numeric ist bereits vektorisiert, müssen Sie nicht anwenden-Funktion in diesem Fall.

    • Ich möchte alle extrahieren „listing_id“ von allen 278226 Elemente aus dieser großen Liste und gespeichert in einem Vektor, nicht konvertieren, um numerische, eigentlich ist es egal, ob es numerisch oder char.
    • bereits gibt Ihnen einen Vektor mit 278226 Elemente. Ich bin mir nicht sicher, was Ihr bittet hier.
    • Was bedeutet class(listings_England) zeigen Sie? Größe hat nichts zu tun mit dem problem.
    • > – Klasse(listings_England) [1] „list“
    • Der Grund, warum ich denke, dass die Größe ist das problem, da habe ich noch eine kleinere Größe der Liste mit kein solches problem.
    • Post eine reproduzierbare Probe in Ihrer Frage. Ich kann nicht reproduzieren Sie Ihre Beobachtungen vor Ort werden die $ – operator funktioniert für mich.

  2. 0

    Als @JesseTweedle Kommentare, Ihr Problem ist ein Daten-spezifische. Irgendwo in Ihren Daten-Objekt listing_id existiert nicht als ein element und damit der Irrt sich. Wrappen Sie Ihre sapply Funktion in einem tryCatch zurückkehren NAs für jene Elemente, ohne listing_id entweder [[ oder $:

    id2 <- sapply(listings_England[1:100000], function(x) 
                     tryCatch(x[["listing_id"]],
                              warning = function(w) return(NA),
                              error = function(e) return(NA)
                     )
           ) 

    Zusätzlich pro Ihre post-it sieht aus wie Sie eine verschachtelte Struktur mit einer benannten Auflistung. Versuchen Sie dies:

    id2 <- sapply(listings_England[1:100000], function(x) 
                     tryCatch(x$listing$listing_id,
                              warning = function(w) return(NA),
                              error = function(e) return(NA)
                     )
           ) 
  3. 0

    Haben Sie, was ich nennen würde eine „verschachtelte Liste“. Sie können sehen, aus der str-Ausgabe, dass nur ein Element an der Spitze der „element-Baum“. Versuchen Sie dies:

    id1 <- sapply(listings_England[[1]], "[[", "listing_id")

    Es dann extrahiert das erste Element (alle Inhalte) und arbeitet auf der daraus resultierenden Liste. Könnte auch die gleichwertigen Betrieb:

    id1 <- sapply(listings_England$listing, "[[", "listing_id")

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.