Seite 1 von 2

Arbeiten mit einer Liste

Verfasst: Di Okt 11, 2016 3:45 pm
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

Re: Arbeiten mit einer Liste

Verfasst: Di Okt 11, 2016 4:02 pm
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

Re: Arbeiten mit einer Liste

Verfasst: Di Okt 11, 2016 5:04 pm
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.

Re: Arbeiten mit einer Liste

Verfasst: Di Okt 11, 2016 7:18 pm
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:

Re: Arbeiten mit einer Liste

Verfasst: Do Okt 13, 2016 2:21 pm
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

Re: Arbeiten mit einer Liste

Verfasst: Do Okt 13, 2016 2:46 pm
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).

Re: Arbeiten mit einer Liste

Verfasst: Do Okt 13, 2016 5:17 pm
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

Re: Arbeiten mit einer Liste

Verfasst: Do Okt 13, 2016 7:30 pm
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

Re: Arbeiten mit einer Liste

Verfasst: Mo Okt 17, 2016 2:05 pm
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

Re: Arbeiten mit einer Liste

Verfasst: Mo Okt 17, 2016 3:03 pm
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