Die Spalten filtern

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

Moderatoren: EDi, jogo

Antworten
vestery
Beiträge: 2
Registriert: Mi Sep 05, 2018 5:55 pm

Die Spalten filtern

Beitrag von vestery » Mi Sep 05, 2018 9:39 pm

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!

Benutzeravatar
EDi
Beiträge: 689
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Die Spalten filtern

Beitrag von EDi » Mi Sep 05, 2018 10:01 pm

Mangels reproduzierbarem Beispiels, hier in Stück Code das auch nicht läuft.

Code: Alles auswählen

rowSums(df == 1)
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

bigben
Beiträge: 720
Registriert: Mi Okt 12, 2016 9:09 am

Re: Die Spalten filtern

Beitrag von bigben » Do Sep 06, 2018 2:47 pm

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.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte

jogo
Beiträge: 1009
Registriert: Fr Okt 07, 2016 8:25 am

Re: Die Spalten filtern

Beitrag von jogo » Do Sep 06, 2018 3:03 pm

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

bigben
Beiträge: 720
Registriert: Mi Okt 12, 2016 9:09 am

Re: Die Spalten filtern

Beitrag von bigben » Do Sep 06, 2018 3:05 pm

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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte

Benutzeravatar
EDi
Beiträge: 689
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Die Spalten filtern

Beitrag von EDi » Do Sep 06, 2018 10:22 pm

Man könnte all.equal() nehmen, das berücksichtigt nämlich schon .Machine$double.eps.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

vestery
Beiträge: 2
Registriert: Mi Sep 05, 2018 5:55 pm

Re: Die Spalten filtern

Beitrag von vestery » Di Sep 11, 2018 5:43 pm

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

Benutzeravatar
EDi
Beiträge: 689
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Die Spalten filtern

Beitrag von EDi » Di Sep 11, 2018 11:25 pm

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.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

bigben
Beiträge: 720
Registriert: Mi Okt 12, 2016 9:09 am

Re: Die Spalten filtern

Beitrag von bigben » Mi Sep 12, 2018 11:25 am

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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast