Seite 1 von 1

Die Spalten filtern

Verfasst: Mi Sep 05, 2018 9:39 pm
von vestery
Hallo zusammen,
ich hoffe, dass ihr mir helfen könnten... bin neu in R und kenne leider noch ziemlich wenig. Ich habe jetzt einen riesen Datensatz (mehr als 1000 Spalten und Zeilen), sieht ungefähr so aus:

Code: Alles auswählen

V1 V2 V3 V4 V5 V6 ....
0  1  1  0  0,5 1 ....
Ich muss herausfinden, wie viele 1-Werte in eine Zeile gibt, aus alle Spalten also soll ich die summierte Anzahl von denen bekommen, die den Wert = 1 betragen.

Ich hab versucht das mit "which"-Befehl zu erledigen, aber hat leider nicht geklappt. Wie kann ich das noch machen, vllt irgendwie diejenige filtern, die ich brauche, und dann den Anzahl von denen rausfinden?
Würde sehr für eure Hilfe dankbar!

Re: Die Spalten filtern

Verfasst: Mi Sep 05, 2018 10:01 pm
von EDi
Mangels reproduzierbarem Beispiels, hier in Stück Code das auch nicht läuft.

Code: Alles auswählen

rowSums(df == 1)

Re: Die Spalten filtern

Verfasst: Do Sep 06, 2018 2:47 pm
von bigben
Hallo vestery,

es ist Dein erster Beitrag und auf den sollst Du auch gleich eine gute Antwort bekommen. In Zukunft versuche bitte, Beispieldaten zur Verfügung zu stellen, mit denen man mögliche Lösungen erproben und auch erklären kann. Das könnte in Deinem Beispiel so aussehen:

Code: Alles auswählen

bsp <- data.frame(V1=c(1,1,1,0.5), V2=c(1,1,0,0.5), V3=c(1,0,0,0.5))
print(bsp)
Eine mögliche Antwort auf Deine Frage würde dann so aussehen:

Code: Alles auswählen

einsen <- apply(bsp, 2, function(x) sum(x==1))
apply(bsp,2 ... wendet eine Funktion auf jede Zeile von bsp an. Diese Funktion betrachtet jede Zeile als Variable x. x==1 vergleich jeden einzelnen Wert mit 1.0 und sum zählt dann, wie oft das wahr ist. In einsen steht also die Zahl der Einsen pro Reihe.

Aber Vorsicht: Vergleiche von floating point Zahlen mit == sind sehr sehr gefährlich, weil manches wie eine 1 aussieht, aber intern als 0.99999999999999999999 hinterlegt ist. Praktisch sieht das dann so aus:

Code: Alles auswählen

> 69.2 + 0.62 == 69.82
[1] FALSE
( mehr darüber hier: http://www.michael-puff.de/Programmieru ... omma.shtml )

Es kann also Sinn machen, nach anderen Lösungen als dem Vergleich einer Fließkommazahl mit einer Konstanten zu suchen, dafür müsstest Du aber mehr Kontext erklären.

LG,
Bernhard


PS: Cool, dass Du im ersten Beitrag schon die code-Tags gefunden hast.

Re: Die Spalten filtern

Verfasst: Do Sep 06, 2018 3:03 pm
von jogo
bigben hat geschrieben: Do Sep 06, 2018 2:47 pm apply(bsp,2 ... wendet eine Funktion auf jede Zeile von bsp an. ...
MARGIN=2 bedeutet Spalte für Spalte (der zweite Index bleibt erhalten)

Gruß, Jörg

Re: Die Spalten filtern

Verfasst: Do Sep 06, 2018 3:05 pm
von bigben
Uuups, blöder Fehler. Danke, Jörg. Also doch EDis Version mit rowSums oder

Code: Alles auswählen

einsen <- apply(bsp, 1, function(x) sum(x==1))
In jedem Fall sollte man aber noch versuchen, diesen Fließkommazahlenvergleich mit == weg zu kriegen.!
Vielleicht in diese Richtung:

Code: Alles auswählen

equals <- function(x,y=1) abs(x-y)<1e-8
bsp$einsen <- apply(bsp, 1, function(x) sum(equals(x)))
(der zweite Index bleibt erhalten)
Auf diese Merkhilfe bin ich noch nicht gekommen. Mal schauen, ob ich mir die merken kann.

LG,
Bernhard

Re: Die Spalten filtern

Verfasst: Do Sep 06, 2018 10:22 pm
von EDi
Man könnte all.equal() nehmen, das berücksichtigt nämlich schon .Machine$double.eps.

Re: Die Spalten filtern

Verfasst: Di Sep 11, 2018 5:43 pm
von vestery
Hallo zusammen,
erstmal großen herzlichen Dank für eure Hilfe!
Ich versuche vllt besser zu erklären, was ich überhaupt brauche. Es geht um einen Markierungsversuch und deren Auswertung. Was ich habe: die dreifarbige Bilder, wo jede Farbe einem Komponente entspricht (Farbstoff, Boden, Skelet), und ne Tabelle, wo ich den Anteil von alle der Komponenten pro Gesamtbild habe. Was ich brauche, ist der Anteil von Farbstoff pro 1mm Tiefe. Ich habe versucht erstmal das Bild in R überhaupt einlesen. Das ist ein tif. Datei, also habe ich das mit read.TIFF gemacht und einen Array bekommen, der ich weiter benutzen wollte.

Code: Alles auswählen

x <- readTIFF("Plot1.tif")
y <- as.data.frame.array(x)
das mit rowSums hat funktioniert - nochmal danke! Aber dann hats mir eingefallen, dass die Tabelle, die ich aus Array bekommen habe, nicht stimmt, und ich kann leider die Daten nicht als plausible betrachten. Wenn ich den Array selbst anschaue, dort sind 529 Zeilen und 404 Spalten. Aber die Tabelle von diesem Array enthält vier mal so viele Spalten:

Code: Alles auswählen

dim(x)
[1] 529 404   4

dim(y)
[1]  529 1616
Jetzt weiss ich nicht, woran es liegen kann und ob ich überhaupt mit den tiff. file was anfangen könnte. Ich hab versucht die Anzahl von Spalten reduzieren, aber hat leider nichts gebracht:

Code: Alles auswählen

z <- unique(y)
dim(z)
[1]  490 1616
wenn ihr mir nochmal helfen könnt, wäre es super.

LG

Re: Die Spalten filtern

Verfasst: Di Sep 11, 2018 11:25 pm
von EDi
Das Problem ist as.data.frame.array.

Dein tif hat vier Bänder(ebenso das array). Ein data.frame ist aber per Definition nur 2 dimensional (Zeilen und Spalten), deswegen hast du vier mal soviele Spalten danach.

Jetzt ist die Frage was du haben willst: pro Band die Anzahl Einsen in jeder Reihe? Nur in einem bestimmten? Für alle zusammen?

Ohne reproduzierbares Beispiel kann ich leider nicht mehr sagen.

Re: Die Spalten filtern

Verfasst: Mi Sep 12, 2018 11:25 am
von bigben
Ich versuche vllt besser zu erklären, was ich überhaupt brauche.
Tut mir Leid, Deine danach kommende Erklärung verstehe ich nicht.Vielleicht könnte ich mir irgendwie was dazu ausdenken, womit die Schilderung vielleicht sinnvoll wird, aber das sehe ich nicht ein: Entweder Du bist willens, Dein Problem kurz und außerhalb Deiner Fachdisziplin nachvollziehbar zu schilden, oder nicht. Die Häufung an Syntaxfehlern deutet darauf hin, dass Du es eher nicht bist.

Gruß,
Bernhard