Arbeiten mit einer Liste

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

damkob

Arbeiten mit einer Liste

Beitrag von damkob »

Hallo,

Ich habe eine Liste "D" mit 1422 Elementen "Large list (1422 elements, 16 Mb)":
$'1'
$'2'
$'3'
$'4'
...
$'1422'
Wie kann ich mir nun einzelne Elemente anzeigen lassen "wenn Bedingung zutrifft".

Beispiel 1: Wie kann ich Elemente auflisten, bei denen in der Variable "wert" mehr als ein NA vorkommt?
$'4'
id bundesland wert
1 4 5
2 2 4
3 4 NA
4 2 NA

Beispiel 2: Wenn in der Variable "bundesland" eine 1 vorkommt?
$'2'
id bundesland wert
1 1 5
2 2 4
3 4 3
4 2 NA

Vielen Dank im Voraus,
damkob
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Arbeiten mit einer Liste

Beitrag von jogo »

Hallo damkob,

bei einer Liste kann jedes Element etwas anderes sein, z.B. erste Element ein Vektor, zweites Element ein Dataframe, drittes Element eine Liste, ...
Ich hoffe, das ist bei Dir nicht der Fall, sondern alle Elemente sind Dataframes und die Dataframes haben alle den gleichen Aufbau.
Dann Beispiel 1:

Code: Alles auswählen

my.na.test <- function(x) sum(is.na(x$wert))>1
D[sapply(D, my.na.test)]
Beispiel 2 (diesmal als Einzeiler mit anonymer Funktion):

Code: Alles auswählen

D[sapply(D, function(x) any(x$bundesland==1))]
Gruß, Jörg
damkob

Re: Arbeiten mit einer Liste

Beitrag von damkob »

Hallo Jörg,

Ich bekomme diese Fehlermeldung:
$ operator is invalid for atomic vectors

Im Netz habe ich den Hinweis gefunden, dass ich $ mit [] ersetzen soll, aber auch dann klappte es leider nicht.

Hast Du einen Vorschlag?

Grüße,
damkob

P.S. Danke auch für die Hilfe beim letzten Problem im alten Forum. Die Befehle haben mir sehr, sehr geholfen.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Arbeiten mit einer Liste

Beitrag von jogo »

Bei mir funktioniert alles bestens:

Code: Alles auswählen

D <- list(
read.table(header=TRUE, text=
"id bundesland wert
1 4 5
2 2 4
3 4 NA
4 2 NA"),
read.table(header=TRUE, text=
"id bundesland wert
1 1 5
2 2 4
3 4 3
4 2 NA"))
my.na.test <- function(x) sum(is.na(x$wert))>1
D[sapply(D, my.na.test)]
D[sapply(D, function(x) any(x$bundesland==1))]
Eventuell müsstest Du mal einige Daten zur Verfügung stellen, z.B.

Code: Alles auswählen

dput(D[1:4])
p.s.: Ist Arbeiten mit einer Liste listiges Arbeiten :?: :lol:
damkob

Re: Arbeiten mit einer Liste

Beitrag von damkob »

Hallo Jörg,

Ja, das Arbeiten mit der Liste ist in der Tat listiges (verschachteltes) Arbeiten.

Zum Problem:
Es funktioniert nicht.

Was ich aber bemerkt habe ist, mein Datensatz sieht so aus:

$`1`
....id bund wert
1...1...1....NA

Und Dein Datensatz sieht so aus
[[1]]
....id bund wert
1...1...1....NA

Meine Objekte in der Liste sind mit $' ' gekennzeichnet und Deine mit [[ ]]. Das ist vielleicht der entscheidende Haken an der Sache? Oder kann es etwas anderes sein?

Grüße,
damkob
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Arbeiten mit einer Liste

Beitrag von jogo »

Zum Problem:
Es funktioniert nicht.
Meinst Du damit, dass das Beispiel, so wie ich es angegeben habe, nicht funktioniert? :shock:
Das ist vielleicht der entscheidende Haken an der Sache?
nein, das ist nicht das Problem. $`1` deutet darauf hin, dass das Listenelement den Namen 1 hat; da aber 1 kein gültiger Bezeichner ist, ist er gequotet. Andererseit kann man jederzeit sich auf die Nummer (= den Index) des Elementes beziehen (so wie ich).

Das Problem liegt darin, dass Du vorher bei den Spaltennamen der Dataframes eine Spalte bundesland hattest, und nun steht dort urplötzlich nur bund
Also, bitte, wie heißt denn die Spalte nun :?: Und warum dieser Wechsel von bundesland zu bund :?:

Gruß, Jörg
p.s.:
Das ganze Leiden kommt daher, weil Du keine vernünftigen Daten bereit stellst :!: dput(...) :!:
... oder Du lieferst uns die Daten so wie ich es in dem Beispiel getan hab (komplett mit Einlesen der Daten).
damkob

Re: Arbeiten mit einer Liste

Beitrag von damkob »

Hallo Jörg,

Nein, daran liegt es nicht. Ich habe ja Deinen Code angepasst.

Hier das was Du gefordert hast (Teildatensatz):

Code: Alles auswählen

structure(list(`7` = structure(list(id = structure(c(944L, 1293L, 
2345L, 2482L, 2938L, 3382L, 4107L, 4975L, 5138L, 6718L, 6949L, 
8657L, 9895L, 9984L, 10056L, 11538L, 11593L, 12892L, 12921L, 
13490L, 13688L, 13879L, 14243L, 14596L, 14696L, 14905L, 15550L, 
16005L, 16290L, 16297L, 16734L, 16752L, 16788L, 16929L, 17484L, 
17492L, 18623L, 19167L, 19219L, 19619L, 19991L, 20465L, 102626L, 
102907L), label = structure("Identifikationsnummer", .Names = "id"), class = c("labelled", 
"integer")), bund = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), label = structure("Bundesland", .Names = "bund"), class = c("labelled", 
"integer")), wert = structure(c(0L, 0L, 0L, 0L, 8L, 0L, 8L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 8L, 58L, 0L, 0L, 0L, 0L, 8L, 
0L, 8L, 0L, 8L, 8L, 0L, 0L, 0L, 0L, 24L, 0L, 8L, 0L, 0L, 0L, 
100L, 0L, 0L, 0L, NA, NA), label = structure("NW-Wert", .Names = "wert"), class = c("labelled", 
"integer")), miss = structure(c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 1L, 1L), label = structure("NA", .Names = "miss"), class = c("labelled", 
"integer")), g = c(7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
7, 7, 7, 7, 7, 7, 7, 7, 7)), .Names = c("id", "bund", "wert", 
"miss", "g"), row.names = c(829L, 1132L, 2080L, 2205L, 2611L, 
3016L, 3662L, 4444L, 4588L, 6022L, 6231L, 7781L, 8919L, 8999L, 
9065L, 10404L, 10453L, 11605L, 11633L, 12148L, 12330L, 12503L, 
12839L, 13152L, 13237L, 13423L, 13996L, 14401L, 14657L, 14664L, 
15050L, 15067L, 15103L, 15228L, 15726L, 15734L, 16738L, 17218L, 
17266L, 17619L, 17945L, 18351L, 35949L, 36115L), class = "data.frame"), 
    `NA` = NULL, `NA` = NULL, `NA` = NULL), .Names = c("7", NA, 
NA, NA))
Grüße,
damkob
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Arbeiten mit einer Liste

Beitrag von jogo »

Du hast Element in der Liste mit dem Wert NULL - mit denen ist natürlich schwer zu arbeiten.
Listenelemente mit dem Wert NULL sind definitiv keine Dataframes :!:

Bereits in meiner ersten Antwort zu diesem Thema hatte ich geschrieben:
bei einer Liste kann jedes Element etwas anderes sein, z.B. erste Element ein Vektor, zweites Element ein Dataframe, drittes Element eine Liste, ...
Ich hoffe, das ist bei Dir nicht der Fall, sondern alle Elemente sind Dataframes und die Dataframes haben alle den gleichen Aufbau.
Bei mir sieht es jetzt so aus mit den Meldungen:

Code: Alles auswählen

> my.na.test <- function(x) sum(is.na(x$wert))>1
> D[sapply(D, my.na.test)]
....
Warning messages:
1: In is.na(x$wert) :
  is.na() applied to non-(list or vector) of type 'NULL'
2: In is.na(x$wert) :
  is.na() applied to non-(list or vector) of type 'NULL'
3: In is.na(x$wert) :
  is.na() applied to non-(list or vector) of type 'NULL'
Die Frage ist nun:
was möchtest Du tun mit den Elementen der Liste, die den Wert NULL haben machen? Entfernen?

Code: Alles auswählen

sapply(D, is.null)
D <- D[!sapply(D, is.null)]
Gruß, Jörg
damkob

Re: Arbeiten mit einer Liste

Beitrag von damkob »

Ja, genau, ich will wissen, welche Elemente mehr als nur einen Fall mit einer NULL haben.
Dann will ich mir diese Elemente genauer ansehen und bei Bedarf löschen.
Das Ansehen und löschen einzelner Elemente kann ich bereits.
Nur den ersten Punkt kriege ich nicht hin.

Danke,
damkob
Zuletzt geändert von damkob am Mo Okt 17, 2016 3:04 pm, insgesamt 1-mal geändert.
damkob

Re: Arbeiten mit einer Liste

Beitrag von damkob »

Noch eine kurze Frage: Können Warnungen i R wie in SPSS vernachlässigt werden?

So wie diese hier:
Warning messages:
1: In which(is.na(x) | (x != vector(typeof(x), 1L)), arr.ind = TRUE) :
Reached total allocation of 16256Mb: see help(memory.size)

Danke
Antworten