Arbeiten mit einer Liste
Arbeiten mit einer Liste
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
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
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:Beispiel 2 (diesmal als Einzeiler mit anonymer Funktion):
Gruß, Jörg
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)]
Code: Alles auswählen
D[sapply(D, function(x) any(x$bundesland==1))]
Re: Arbeiten mit einer Liste
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.
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
Bei mir funktioniert alles bestens:
Eventuell müsstest Du mal einige Daten zur Verfügung stellen, z.B.
p.s.: Ist Arbeiten mit einer Liste listiges Arbeiten
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))]
Code: Alles auswählen
dput(D[1:4])
Re: Arbeiten mit einer Liste
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
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
Meinst Du damit, dass das Beispiel, so wie ich es angegeben habe, nicht funktioniert?Zum Problem:
Es funktioniert nicht.
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 ist vielleicht der entscheidende Haken an der Sache?
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
Hallo Jörg,
Nein, daran liegt es nicht. Ich habe ja Deinen Code angepasst.
Hier das was Du gefordert hast (Teildatensatz):
Grüße,
damkob
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))
damkob
Re: Arbeiten mit einer Liste
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:
Die Frage ist nun:
was möchtest Du tun mit den Elementen der Liste, die den Wert NULL haben machen? Entfernen?
Gruß, Jörg
Listenelemente mit dem Wert NULL sind definitiv keine Dataframes
Bereits in meiner ersten Antwort zu diesem Thema hatte ich geschrieben:
Bei mir sieht es jetzt so aus mit den Meldungen: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.
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'
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)]
Re: Arbeiten mit einer Liste
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
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.
Re: Arbeiten mit einer Liste
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
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