Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
Praktikant Toolentwicklung Matlab (m/w)
Branche: Beratung, Expertise, Fahrzeugtechnik, Fahrzeugteile, Technische Dienstleistungen
MBtech Group GmbH & Co. KGaA - Fellbach

Abschlussarbeit / Praktikum: Entwicklung Matlab (m/w)
Branche: Informationstechnologie, Elektrotechnik, Elektronik
GIGATRONIK Technologies GmbH - Ulm

Werkstudent (m/w) in der MATLAB-Entwicklung
Branche: Luft-, Raumfahrttechnik, Dienstleistungen
univativ GmbH & Co. KG - Hamburg

Studentischer Mitarbeiter (m/w) - DevOps / Toolentwicklung
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Berlin

Bachelor-/Masterarbeit in der Softwareentwicklung
Branche: Fahrzeugtechnik, Fahrzeugteile
über Campusjäger GmbH - Karlsruhe

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

xlsxred automatisch ohne NaN Spalten

 

remix92
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 13:27     Titel: xlsxred automatisch ohne NaN Spalten
  Antworten mit Zitat      
Hallo,

Ich hänge an ein Problem fest, bei dem ich nicht weiterkomme...

Ich importiere Daten aus einem Excel File.
In der Ersten Zeile befinden sich Die Überschriften.
Ab der 2 Zeile Sind die Werte eingetragen.

Ich würde gern nun autoamtisiert Nur Spalten in matlab improtieren, die ab der 2 Zeile Werte Enthalten bzw. keine NaN Spalten sind!!!

Derzeit mach ich das wie folgt:
Code:

 [TestData,header]= xlsread ('Example.xlsx');
 TestData( :, all( isnan( TestData), 1 ) ) = [];
 Titel=header(1,1:end);
 Title= transpose(Titel);
 


Sprich: Die NaN Spalten werden über matlab gelöscht.
Da tritt folgendes Problem auf:
Die Titel werden bzw können nicht automatisch mit gelöscht werden, da das als "Cell Wert" im Workspace hinterlegt ist...

Habt ihr denn eine Lösung für mein problem?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 17.656
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 06.12.2017, 14:00     Titel:
  Antworten mit Zitat      
Hallo,

du brauchst dir nur zu merken, welche Spalten gelöscht werden:

Code:
[TestData,header]= xlsread ('Example.xlsx');
todelete = all( isnan( TestData), 1 );
TestData( :,  todelete) = [];
Titel=header(1,1:end);
Titel(todelete) = [];
Titel= transpose(Titel);
 


Für tabellarische Daten rate ich generell zu readtable und in diesem Fall ismissing:
Code:
data = readtable('Example.xlsx');
data(:, all(ismissing(data), 1)) = [];


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 14:21     Titel:
  Antworten mit Zitat      
Vielen Dank Smile

Ist es denn möglich, Spalten die Aus "0 Einträgen" bestehen ebenfalls zu löschen und mit NaN zu kombinieren?

Also alle NaN-Spalten und 0-Spalten zu löschen ?


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.656
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 06.12.2017, 14:57     Titel:
  Antworten mit Zitat      
Hallo,

Anpassung für den ersten Ansatz:
Code:
todelete = all( isnan( TestData) | TestData == 0, 1 );


für den zweiten Ansatz:
Code:
data(:, all(ismissing(data, {NaN, 0}), 1)) = []


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 16:52     Titel:
  Antworten mit Zitat      
Vielen Dank Smile

ich hab ein kleines Problem entdeckt...

mein Code sieht nun folgendermaßen aus:
Code:

 [TestData,header]= xlsread ('TestData_Example.xlsx');
todelete = all( isnan( TestData) | TestData== 0, 1 );
TestData( :,  todelete) = [];
Titel=header(1,1:end);
Titel(todelete) = [];
Title= transpose(Titel);
 


Im TestData werden nun dementsprechend Die Spalten mit 0 und NaN Einträgen gelöscht.
Aber die Überschriften werden irgendwie falsch gelöscht...
Erkenne leider kein System dahinter nach welchem Verfahren die Übershriften gelöscht werden.

Aufjedenfall werden einige Überschriften nicht gelöscht, die gelöscht werden sollten, da bei diesen Spalten nur NaN Einträge vorhanden sind...

Woran liegt das bzw. was mach ich falsch ?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 17:44     Titel:
  Antworten mit Zitat      
Ich hab ein wenig den Code umgeschrieben und das Problem eventuell vereinfacht...

Code:

data = readtable('TestData_Example.xlsx');
data(:, all(ismissing(data, {NaN, 0}), 1)) = [];
TestData= table2array(data)
 


Hab dein Tipp mit table zu herzen genommen und es zuerst als table gespeichert und Dann in ein Array umgewandelt um somit für meine Spätere Arbeit voranzukommen.

Kann ich denn auf die Überschriften verweißen, sodass ich z.B Plots mit den jeweiligen Überschriftennamen von data abspeichern kann ?

Allgemein möchte ich mit den Überschriften weiterarbeiten. Aber ich weiß nicht wie Syntax dafür lautet....

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.656
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 06.12.2017, 18:23     Titel:
  Antworten mit Zitat      
Hallo,

Code:
titles = data.Properties.VariableNames;


Was den xlsread-Ansatz angeht: ohne ein reproduzierbares Beispiel kann ich auch nicht sagen, was da schief geht. Es kann z.B. sein, dass headers andere Inhalte hat als du erwartest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2017, 10:33     Titel:
  Antworten mit Zitat      
klappt wunderbar Smile

das mit Header aber ich jetzt ausgelassen und klappt wunderbar !
Ist es denn möglich noch eine Letzte Bedingung mit einzubauen?
Bisher waren die Bedingungen:
1. NaN-Spalten löschen
2. 0-Spalten löschen

Meine zusätzlich gewünschte Bedingung wäre:
3. Spalten zu löschen, die nur Texte enthalten

Wäre Super, wenn das noch möglich wäre Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.656
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 07.12.2017, 18:58     Titel:
  Antworten mit Zitat      
Hallo,

ich vermute mal, dass es gerade um die Tables geht? Bei xlsread wird Text ja zu NaN.

Bei Tables kannst du die Datentypen der Spalten so abfragen und anschließend filtern:
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2017, 14:49     Titel:
  Antworten mit Zitat      
Hi,
genau im table müsste ich die Spalten löschen.

Nun stellt sich heraus, dass es "Cell" Datentypen sind, die gelöscht werden müssen.

Nun hänge ich dran, den Code so umzuschreiben, dass auch alle "Cell" Spalten gelöscht werden...

Code:

TestData(:, all(ismissing(TestData, {NaN, 0,Cells}), 1)) = [];
 


Wäre auch zu einfach wenn das funktionieren würde Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.656
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 08.12.2017, 17:48     Titel:
  Antworten mit Zitat      
Hallo,

die Idee war eher, dass du den genannten Befehl verwendest, um den Datentyp jeder Spalte zu bekommen, dann vergleichst, und die Spalten löschst. Also separat von der 0/NaN-Vorgehensweise.

Code:
datatypes = table2cell(varfun(@class, data));
toremove = strcmp(datatypes, 'cell');
data(:, toremove) = [];


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2017, 21:26     Titel:
  Antworten mit Zitat      
Funktioniert super Smile

Ohman eine letzte Frage habe ich noch...

Ist es möglich Spalten mit gewissenen Überschriften zu löschen im table?
der Code zum löschen lautet ja zb so: Spalte "Hallo" wird gelöscht
Code:
data.hallo = [];


Aber wenn diese Spalte nicht existiert, bekomme ich folglicherweiße eine Fehlermeldung.

Ist es denn möglich diese Fehlermeldung zu ignorieren bzw. einfach den befehl zu ignorieren, falls diese Spalte nicht existiert?

Gruß

PS:tut mir leid, dass ich so viele Fragen stelle Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du kannst das in einen try-catch Block packen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2017, 12:14     Titel:
  Antworten mit Zitat      
Perfekt vielen Dank Smile
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 goPCB.de


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


Copyright © 2007 - 2017 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.