Verfasst am: 26.10.2013, 15:35
Titel: CSV-Datensatz nach Intervallen aufspalten
Hey Jungs,
ich bin relativ neu bei MATLAB und hab halt noch einige Probleme....wollte deswegen mal gucken ob mir hier vll wer helfen kann.
Geht um folgendes:
Ich habe einen relativ großen Datensatz in .csv vorliegen, ich wollte daraus Matritzen mit kleineren Datensätze bilden (also clustering sozusagen) um besser damit arbeiten zu können.
Aber irgendwie zeigt er mir immer einen Fehler an...
Im Anhang ist ein Ausschnitt von meinem Datensatz, ich will den Datensatz anhand von 'latitude' aufspalten..aslo z.b. alles mit 37 davor soll ein Datensatz sein und so weiter. Das kann ich ja später auch auf 'longtitude' ausweiten um ne genaue Ortsangabe zu haben....
Undefined function 'eq' for input arguments of type 'cell'.
Error in test1 (line 10)
if data(a,2) == aa;
kann mir wer helfen was ich falsch mache?
Bin da irgendwie am verzweifeln....
Vll noch als Info was ich genau machen will: Das Ziel ist es ein Programm zuschreiben, dass mir num_votes, num_comments und num_views vorhersagt...hab noch nen anderes Datenset wo diese Sachen eben fehlen und ich die vorhersagen muss...vll hat da auch einer ne Idee wie man das einfach machen könnte?
hier noch die Original-csv datei, ohne die in excel irgendwie verändert zu haben....da fällt mir sofort auf, dass der Delimiter ein , ist und kein ;....
Verfasst am: 26.10.2013, 22:17
Titel: Re: CSV-Datensatz nach Intervallen aufspalten
Hallo Nemo2002,
Daten-Files als Bilder zu posten ist sehr unpraktisch. Die Leser können sie so nicht benutzen.
Zunächst rate ich mal, wie so oft, "clear all" unbedingt wegzulassen. Wer immer das auch empfohlen haben mag, es ist eine wirklich schlechte Idee: Es löscht auch alle Breakpoints, und alles, was den Debugger behindert ist ein Feind des Programmierers.
"size(data, 1)" ist deutlich eleganter als "length(data(:,1))".
Was soll "for aa = 37:37.99" machen? Der Vektor "37:37.99" ist die Liste der Zahlen in ganzen Schritten von 37 bis 37.99, also die Zahl 37 selbst.
Ich vermute, Du meinst:
Code:
index = data(:, 2) > 37 && data(:, 2) <= 37.99;
A = data(index, :);
schau doch mal in den Workspace, da steht der Datentyp der Variable.
Bei data steht vermutlich, wie bei der Rückgabe von textscan üblich, Cell Array - und für solche sind eben Operatoren wie > nicht definiert. Sinnvoll wäre es, die Rückgabe von textscan in ein Double Array umzuwandeln, z.B. mit cell2mat.
Ich hab erstmal nur für > 38 gemacht, da mir sonst wegen dem && ein Fehler kommt, aber das klappt auch nicht...bekomme zwar eine Matrix für data2, aber sie ist vollkommen leer, genau wie B
das Problem liegt schon beim Einlesen und führt dazu, dass data2 leer ist. Das wird auch im Command Window so ausgegeben.
Schau doch also erst mal, dass die Datei überhaupt richtig eingelesen wird, bevor du dich an die Analyse machst.
Du hast da eine recht kompliziert aufgebaute Datei, in der es definitiv keinen Sinn macht, wie von dir angegeben 8 Doubles einzulesen. Welche Informationen brauchst du denn aus der Datei?
Naja, das Ziel ist halt, num_votes, num_comments und num_views vorherzusagen (siehe 1. Beitrag mit dem foto der excel-datei).
Ich hatte vor den Datensatz aufzuteilen, da er ja ziemlich groß ist. Meine Idee war diese aufteilung anhand der Längen- und Breitengrade zu machen, bzw. erstmal mit einem davon und wenn es klappt gucken ob man es erweitern kann.
Auch brauch ich das 11. Feld (tag_type)..dies wollte ich mit MATLAB so umwandenln, das jedem Ereignis eine Zahl zugeordnet wird und diese dann in der Matrix abgespeichert wird, sodass man auch damit das clustering machen könnte.
Das Feld 'description' wollte ich die Anzahl der Zeichen zählen und diese in der Matrix speichern.
Auch brauch ich die Uhreiz, wobei das Format vll problematisch sein könnte....
Wichtig wären eigentlich nur die Spalten id, latitude, longitude, created_time, tag_type
die Datei ist sehr schwierig zu lesen, da Komma mal Trennzeichen ist und mal nicht. Die Anführungszeichen helfen zwar, werden aber teilweise leider auch innerhalb der Strings verwendet, was dann wieder alles andere als hilfreich ist. Ich würde generell versuchen, Daten in einem halbwegs vernünftigen Format zu bekommen.
Hier ein Versuch, diese Datei ordentlich einzulesen und die Inhalte zu extrahieren:
Code:
fid = fopen('trorg.csv');
s = textscan(fid, '%s', 'delimiter', '', 'headerlines', 1);
s = s{1}(2:10000);
fclose(fid);
s = cellfun(@(s)[s, ','], s, 'UniformOutput', false);
t = regexp(s, '"([^"]*)",', 'tokens');
clear s
t(cellfun(@numel, t) ~= 11) = []; % hier werden nicht konforme Zeilen (es sind in diesem Datensatz 2) ignoriert
t = vertcat(t{:});
t = cellfun(@(t) t, t);
id = str2double(t(:,1));
latitude = str2double(t(:,2));
longitude = str2double(t(:,3));
num_votes = str2double(t(:,6));
num_comments = str2double(t(:,7));
num_views = str2double(t(:,8));
created_time = datenum(t(:,10),'yyyy-mm-dd HH:MM:SS');
tag_type = nominal(t(:,11));
clear t
ich habe die Datumsangaben in numerisches Format umgewandelt (Tage ab 1.1.0000). Damit kannst du am besten weiterarbeiten und z.B. Vergleiche durchführen.
Dies klappt aber nur für das <=38, wegen dem && gibt er mir folgenden Fehler:
Operands to the || and && operators must be convertible to logical scalar values.
Und 2.:
Kann ich auch tag_types irgendwie in die Matrix einbinden? der Vektor ist ja nominal, kann man den in double umwandeln? Oder wärs möglich irgendwie den verschiedenen Ausdrücken in tag_types eine Zahl zuzuordnen? Es sind nur 43 verschiedene Ausdrücke....könnte man das irgendwie codieren?
Sorry wenn ich dich mit den vll einfachen Fragen nerv.
Das ist top, vielen Dank....jetzt geht es, auch mit dem einfachen begriff double scheinen die kategorien in ne zahl umgewandelt zu sein, das reicht mir.....
"734869,137962963" sagt nicht genau aus, was das ist. Ist das ein String, Cell string oder eine Dezimal-Zahl bei der Du aus optischen Gründen ein Komma statt des Dezimal-Punktes verwendest. Wir können auch nicht erraten, wieso Du das "nicht richtig" findest. Was wäre denn richtig? Es könnte sich um einen serielles Date-Format handeln, siehe z.B. "help datenum". Es könnte aber auch das serielle Datumsformat von Excel sein, dann lohnt sich eine suche im Netz nach "Matlab serial date Excel".
Bitte schicke doch mal den Seminar-Leiter in dieses Forum für eine Diskussion über "clear all". Während irgendwelche Dozenten das immer wieder anpreisen, führe ich im Forum einen langwierigen und für die regelmäßigen Leser bestimmt schon lächerlichen Kampf dagegen, da so viele Probleme von den Fragenden selbst geklärt werden könnten, wenn sie nur den Debugger benutzen könnten.
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
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.