Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Dublikate aus einer Spalte aussortieren

 

Barbara_Karl93
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2018, 08:13     Titel: Dublikate aus einer Spalte aussortieren
  Antworten mit Zitat      
Hallo zusammen,
ich habe eine .csv Datei eingelesen in matlab als Cells.
In dieser stehen in jeder Zeile Daten, die jeweils mit einer ID identifizierbar sind. Diese ID kommt mindestens 2 mal vor. (ein Endzeitpunkt und ein Startzeitpunkt).

Ich möchte nun aus der kompletten Tabelle, in der in Spalte 2 diese ID steht, alle Dublikate einer ID löschen. Dabei möchte ich die ID mit dem ersten/frühesten/ältesten Datum behalten. (Uhrzeit steht in Spalte 20)

Datum ist in folgendem Formalt in dem Cell enthalten:
dd.mm.yyyy HH:MM:SS

Ich hoffe mir kann jemand helfen, leider habe ich diese Art von Aufgaben noch nie bearbeitet.

Herzlichen Dank schon mal für die Hilfe!! 

hilfe_matlab_2.PNG
 Beschreibung:

Download
 Dateiname:  hilfe_matlab_2.PNG
 Dateigröße:  21.48 KB
 Heruntergeladen:  21 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 10.755
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.11.2018, 17:37     Titel: Re: Dublikate aus einer Spalte aussortieren
  Antworten mit Zitat      
Hallo Barbara_Karl93,

Was ist Deine Frage?
Kannst Du die Tabelle in Matlab bereits importieren oder gehört das zum Problem?
Zitat:
ID mit dem ersten/frühesten/ältesten Datum

Sind das 3 Daten oder bedeuetet "ersten" und "frühesten" das gleiche?

Gruß, Jan 
Private Nachricht senden Benutzer-Profile anzeigen
 
Barbara_Karl93
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2018, 19:41     Titel:
  Antworten mit Zitat      
Tut mir leid, das ich mich nicht gut ausgedrückt habe.

Die Datei ist eingeladen! Und mit der Zeit ist die ältere gemeint, ich wusste nicht wie ich das am besten schreibe.

Sorry... 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.755
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.11.2018, 15:42     Titel:
  Antworten mit Zitat      
Hallo Barbara_Karl93,

Rückfragen gehören im Allgemeinen zum Weg ein Problem zu lösen. Und dafür ist dieses Forum ja da :-)

Wie hast Du die Datei genau geladen? Wurde das Datum als datetime Objekt eingelesen?
Möglicherweise bekommst du die gewünschten Indices mit einem einfachen unique(..., 'last') Befehl hin. Bei "dd.mm.yyyy HH:MM:SS" kann man aber nicht einfach vorher alphabetisch sortieren, während das bei "yyyy.mm.dd HH:MM:SS" möglich wäre. Dann hilft die Umwandlung in ein datetime-Objekt oder das alte datenum.

Gruß, Jan 
Private Nachricht senden Benutzer-Profile anzeigen
 
Barbara_Karl93
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2018, 16:08     Titel:
  Antworten mit Zitat      
Hallo Jan S,

danke für den Vorschlag mit unique. Zumindest rechnet Matlab was. Ich bin mir aber nicht ganz sicher ob es das gewünschte Ergebnis liefert, ich denke mal noch nicht ganz.
Zum Verständis: in Spalte 2 stehen meine ID's und in Spalte 20 wäre die Uhrzeit mit Datum.
eingegeben habe ich jetzt:
A=zvmoktober;
B=unique([A{:,2}], 'last')


Ergebnis: beispielhaft ein Ausschnitt:
Columns 85629 through 85632

"246475" "246476" "246477" "246478"

Columns 85633 through 85636

"246479" "246480" "246481" "246482"

Columns 85637 through 85640

"246483" "246484" "246485" "246486"


Realistisch ist das Ergebnis, denn ich habe jede ID mindestens 2 mal....


Wie mein Datum eingelesen wurde, weiß ich ehrlich gesagt nicht. Die Spalte mit dem Datum und der Zeit ist in einer riesigen Tabelle enthalten, und die komplette Tabelle habe ich als Cell-Datei eingelesen.

Meine Frage zu dem unique-Befehl:
Welche Spalte gebe ich dann an? Ich möchte die Dublikate bei den ID's aussortieren aber eben je nach dazugehöriger Uhrzeit. Die komplette Zeile der Dublikate soll dann bestenfalls auch gleich gelöscht werden.

Vielleicht wird mein Problem jetzt nochmal klarer. Ich weiß nicht wie ich es sonst besser formulieren soll.


Vielen Dank schon mal für die Hilfe! 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.755
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.11.2018, 16:10     Titel:
  Antworten mit Zitat      
Hallo Barbara_Karl93,

Zitat:
Wie mein Datum eingelesen wurde, weiß ich ehrlich gesagt nicht.

Mit welchem Befehl hast Du das File denn eingelesen?

Ein kleines Beispiel mit Deinen Daten würde helfen.
Vielleicht hilft dies:
Code:
key = strcat(Data(:, 2), '*', Data(:, 20));
[~, index] = unique(key, 'last');
Result = Data(index, :);

Gruß, Jan 
Private Nachricht senden Benutzer-Profile anzeigen
 
Barbara_Karl93
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2018, 05:51     Titel:
  Antworten mit Zitat      
Wenn ich deinen Code
Code:
key = strcat(Data(:, 2), '*', Data(:, 20));
[~, index] = unique(key, 'last');
Result = Data(index, :);


einfach Teste, dann kommt folgende Fehlermeldung:
Code:
Error using cell/unique (line 85)
Cell array input must be a cell array of character vectors.

Error in Untitled7 (line 3)
[~, index] = unique(key, 'last');
 
>>


Ich denke das "unique" nicht mit dem Dateiformat "Cell" in Matlab zusammenpasst. Vielleicht kann ich meine Datei ja doch anders einlesen....
Jezt hab ichs mit deinem Code mit {} klammern probiert. dann kommt keine Fehlermeldung aber auch irgendwie keine Tabelle als Ergebnis....sondern ein 1x1 string, mit dem Inhalt Result="xxx"

Jetzt erst mal der Anhang, mit dem .m File zum einladen der Datei. Ich habe es händisch ausgewählt mit der Matlab Oberfläche und dann gespeichert. Quasi das ich es nicht jedes mal wieder händisch einladen muss. Wenn es dafür eine Elegantere Lösung gibt, bin ich dafür gerne offen.

Außerdem habe ich einen sehr kleinen Ausschnitt meiner Datei mit eingefügt, sie ist als .csv Datei gespeichert. Beim Speichern steht dort aber "unicodeText", falls das noch wichtig ist. Ich kann hier leider keine csv oder xlsx Datei hochladen. Daher jetzt in bildformat. Ich habe alle unrelevanten Spalten mal ausgeblendet, damit es nicht zu Unübersichlicht wird.

Nochmal zur erklärung was ich möchte:

Ich brauche in der Tabelle mit der ich weiterarbeiten will, die ID's (Spalte B/2)mit der aktuelleren Uhrzeit (aus Spalte T/20) und dem Code (I/9), der NICHT "127" ist. Alle Anderen Zeilen dürfen gelöscht werden. Somit sollte ich keine Dublikate oder Mehrfachnennungen mehr bei den ID's haben.

Gruß
Barbara 

importer_csv_datei.m
 Beschreibung:
Die Datei mit der ich meine .CSV datei einlese in matlab

Download
 Dateiname:  importer_csv_datei.m
 Dateigröße:  1.87 KB
 Heruntergeladen:  12 mal
hilfe_matlab_3.PNG
 Beschreibung:
Hier ein Bild der Datei, mit den gekennzeichneten Spalten, Uhrzeit, ID und Code.

Download
 Dateiname:  hilfe_matlab_3.PNG
 Dateigröße:  74.46 KB
 Heruntergeladen:  11 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 19.278
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 23.11.2018, 10:49     Titel:
  Antworten mit Zitat      
Hallo,

ich hatte dir ja mal empfohlen, die Daten als Table einzulesen. Das únd die Verwendung von datetime für die Datumsspalte könnte das ganze sehr erleichtern.

Wenn du einen Ausschnitt deiner Daten anhängst statt nur ein Bild davon, könnte man die Vorschläge direkt ausprobieren. Das würde einiges an Hin und Her ersparen.

Grüße,
Harald 
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Barbara_Karl93
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2018, 14:04     Titel:
  Antworten mit Zitat      
Hallo Harald,

Ja ich werde es nochmal versuchen die Datei anders einzuladen.
Allerdings das mit dem Hochladen funktioniert irgendwie nicht. In welchem Format kann ich hier in dem Forum denn eine in excel vorliegende Datei hochladen.
Es kam immer die meldung das dieses von mir verwendete Format verboten sei. (Versucht habe ich .csv und .xlsx)

Vielen Dank!

Gruß Barbara

[EDITED, Jan, Bitte nicht die gesamte vorhergehende Nachricht zitieren - Danke!] 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.755
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.11.2018, 14:41     Titel:
  Antworten mit Zitat      
Hallo Barbara_Karl93,
Zitat:
Ich denke das "unique" nicht mit dem Dateiformat "Cell" in Matlab zusammenpasst.

Ein kurzer Blick in die Dokumentation klärt, dass unique durchaus mit Cells funktioniert. Sie müssen dann allerdings Char-Vektoren enthalten. Ob mein Beispiel dies tut, weiß ich nicht, weil Du so weit ich sehe noch nicht erklärt hast, wie Deine Input-Daten genau aussehen.

Es wäre einfacher eine Lösung zu schreiben, wenn Du einen kleinen Beispiel-Datensatz posten würdest, denn dann müsste man nicht mehr raten, welche Daten Du genau meinst.

Zitat:
Jezt hab ichs mit deinem Code mit {} klammern probiert.

Bitte poste den Code, ich weiß nicht genau, was Du wie probiert hast.

Zitat:
Beim Speichern steht dort aber "unicodeText", falls das noch wichtig ist.

Was meinst Du mit "beim Speichern"?

Zitat:
Ich kann hier leider keine csv oder xlsx Datei hochladen.

Du kannst das File einfach als Zip komprimieren und dann hochladen. Ein Screenshot ist weniger hilfreich.

Zitat:
Ich brauche in der Tabelle mit der ich weiterarbeiten will, die ID's (Spalte B/2)mit der aktuelleren Uhrzeit (aus Spalte T/20) und dem Code (I/9), der NICHT "127" ist. Alle Anderen Zeilen dürfen gelöscht werden. Somit sollte ich keine Dublikate oder Mehrfachnennungen mehr bei den ID's haben.

Das Detail mit "127" hattest Du bisher noch nicht erwähnt. Bitte versuche das Problem so klar wie möglich zu beschreiben. Eigentlich geht es wohl nur um 3 Zeilen Code, es wird nur nicht richtig klar, was die Inputs genau sind und was Du erreichen möchtest.

Gruß, Jan 
Private Nachricht senden Benutzer-Profile anzeigen
 
Barbara_Karl93
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2018, 08:03     Titel:
  Antworten mit Zitat      
Hallo zusammen,

tut mir leid für die Unklarheiten, ich versuche es jetzt einach nochmal von Beginn an, ich hoffe das ich bei der Problembeschreibung jetzt nichts vergesse und ich die Datei richtig eingeladen habe. Im Anhang auch ein Beispiel!

Importieren der Datei:
Die Tabelle ist nun eingelesen als "table" mit dem im Anhang liegenden .m-File, dieses habe ich beim manuellen Import schreiben lassen und so abgespeichert. Ich denke so kann man mein "Einladen" der Datei am besten nachvollziehen.
Vielleicht könnt ihr mir dazu ja sagen, ob das nun die bessere bzw Beste Möglichkeit ist meine Daten zu analysieren. (Zuvor war es ja als "Cell" eingelesen, was anscheinend keine so optimale Lösung war....)

Beschreibung des Problems:
Ich brauche in der Tabelle mit der ich weiterarbeiten will, die ID's (stehen in Spalte 2) mit der aktuelleren Uhrzeit (die steht in Spalte 20) und dem Code in Spalte 9), der NICHT "127" lautet. Alle anderen Zeilen der Tabelle dürfen gelöscht werden. Somit sollte ich keine Dublikate bzw. Mehrfachnennungen mehr bei den ID's haben, es sollte dann quasi jede ID einmal mit einer Uhrzeit vorhanden sein!



Zur vollständigkeit des voerherigen Verlaufs:
Den weiter oben vorgeschlagenen Code, habe ich jetzt auch nochmal getestet, aber ich glaube wenn ich die Error-Meldung richtig verstehe, passt das jetzt nicht mit der Formatierung der jetztigen "Import-Variante" zusammen.
Vorgeschlagener Code:
Code:
Data=ausschnitttesteinlesen;
key = strcat(Data(:, 2), '*', Data(:, 20));
[~, index] = unique(key, 'last');
[b]Result = Data(index, :);

Fehler-Meldung:[/b]
Code:
Error using strcat (line 46)
Inputs must be character vectors, cell arrays of character vectors, or string arrays.

Error in Untitled20 (line 2)
key = strcat(Data(:, 2), '*', Data(:, 20));
 
>>



Nochmal vielen Dank für die Geduld mit mir, ich hoffe das ich die Antworten jetzt besser formuliere und mit Beispielen erkläre! 

Matlab_hilfe_Importer_01.m
 Beschreibung:
Skript, wie ich meine Datei importiert habe als "table".

Download
 Dateiname:  Matlab_hilfe_Importer_01.m
 Dateigröße:  2.79 KB
 Heruntergeladen:  8 mal
ausschnitt_test_einlesen.zip
 Beschreibung:
Ausschnitt aus der Datei die zu analysieren ist.

Download
 Dateiname:  ausschnitt_test_einlesen.zip
 Dateigröße:  1.23 KB
 Heruntergeladen:  6 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 19.278
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 26.11.2018, 13:42     Titel:
  Antworten mit Zitat      
Hallo,

die Zeilen mit 127 kann man vorab entfernen:
Code:
ausschnitttesteinlesen(ausschnitttesteinlesen.Spalte9 == 127,:) = [];


Dann bleibt aber bei dem Datensatz hier pro ID nur noch eine Zeile. Ist es im echten Datensatz so, dass die verbleibenden Zeilen nach ID und Uhrzeit sortiert sind?

Falls nicht, würde ich sortieren:
Code:
ausschnitttesteinlesen = sortrows(ausschnitttesteinlesen, {'Spalte2', 'Spalte20'}, 'ascend');


Das Entfernen der überflüssigen Werte kann man dann erledigen, indem man immer mit der Zeile vorher vergleicht.

Grüße,
Harald 
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Barbara_Karl93
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2018, 15:29     Titel:
  Antworten mit Zitat      
Hallo,

vielen dank, das funktioniert hervorragend!
Die Daten wären so nicht sotiert, doch dann sind sie es!

Ich habe jetzt folgendes aufgesetzt, doch so ganz funktioniert es nicht.
Ich habe versucht, fortlaufend zwei zeilen mitenander zu vergleichen und die Zeile zu löschen, mit der "kleineren" Zeit, wenn hald die ID gleich ist.

Ich steht gerade auf der Leitung, wo er denn noch klammern will...oder mein Ansatz ist doch komplett falsch??

Code:
A=ausschnitttesteinlesen;
A(A.Spalte9 == 127,:) = []; % Löschen der Zeilen mit 127
A = sortrows(A, {'Spalte2', 'Spalte20'}, 'ascend'); %Sortieren der Zeilen
m = height(A); %Zeilenanzahl
k=1;
n=k+1;
b=0;
for k=[1:m]
if (A(20:n)) > (A(20:k)) && (A(2:n)) == (A(2:k))
   A(A(k:))=[]
end
end


Fehlermeldung:
Code:
Error: File: Untitled6_01.m Line: 10 Column: 10
Invalid expression. When calling a function or indexing a variable, use parentheses. Otherwise, check for mismatched
delimiters.



Gruß

Barbara 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 19.278
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 26.11.2018, 16:02     Titel:
  Antworten mit Zitat      
Hallo,


statt A(20:n) meinst du vermutlich A(n, 20) bzw. A{n, 20}.

Eine Möglichkeit, Schleifen zu vermeiden, wäre: die Zeiten absteigend sortieren und Zeilen rauszuschmeißen, wenn sie die gleiche ID zur vorherigen haben

Code:
A = sortrows(A, {'Spalte2', 'Spalte20'}, {'ascend', 'descend'});
remove = [false; diff(A.Spalte2) == 0];
A(remove,:) = [];


Grüße,
Harald 
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Barbara_Karl93
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2018, 14:57     Titel:
  Antworten mit Zitat      
Hallo,

ach das umgedrehte hatte ich auch noch getestet, aber der vorgeschlagene Code funktioniert!
Dankeschön!

Gruß
Barbara 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.



goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.