Verfasst am: 18.06.2013, 09:13
Titel: Spalten miteinander vergleichen und zusammenfügen
Guten Tag goMATLAB-Community,
ich sitze seit zwei Tagen an einem Problem, komme aber leider nicht voran.
Ich habe jeweils zwei Spalten (eine Spalte besteht aus Strings, die andere, dazugehörige Spalte aus Zahlen) aus verschiedenen Tabellen, die miteinander verglichen werden sollen. Am besten erkläre ich das Problem an einem vereinfachten Beispiel:
Zwei Spalten aus TABELLE A:
1. Spalte:
Auto
Laptop
Fernseher
2. Spalte Anzahl:
Zwei Spalten aus TABELLE B:
1. Spalte:
Auto
Fahrrad
Fernseher
2. Spalte Anzahl:
Ich möchte nun jeweils beide Spalten miteinander vergleichen und zusammenfügen, sodass am Ende nur noch eine Spalte mit den Artikelnamen und eine Spalte mit der Anzahl da steht. In diesem Beispiel wäre das so:
Zusammengefügt:
1. Spalte:
Auto
Laptop
Fernseher
Fahrrad
2. Spalte Anzahl:
Das Problem ist, dass ich irgendwie die beiden ersten Spalten mit den Artikelnamen vergleichen muss und sobald dasselbe drinsteht (z.B. Auto) müssen die dazugehörigen Werte (Anzahl) addiert werden, ansonsten, falls ein neuer Artikel auftaucht (hier Fahrrad), soll es in der neue Spalte als neue Zeile erscheinen. Ich hoffe, dass ich das Problem erklären konnte.
Ich habe jeweils zwei Spalten (eine Spalte besteht aus Strings, die andere, dazugehörige Spalte aus Zahlen) aus verschiedenen Tabellen, ...
Und hier kann ich Dir bereits nicht mehr folgen. Was sind denn genau "Spalten" und "Tabellen"? Wenn Du den entsprechenden Matlab-Code postest, wird dies auf Anhieb klar. Wenn wir erraten, was dies sein könnte (vielleicht die Spalten eines Cell-Array, oder zwei Cell Arrays, oder vielleicht sprichst Du auch von Excel-Files), liegen wir vielleicht vollkommen daneben und eine Antwort verwirrt Dich zusätzlich.
es handelt sich um eine GUI, die sehr aufwendig ist, deshalb wollte ich mein Problem eher sehr einfach darstellen. Kann gut sein, dass ich das mit den Tabellen und Spalten etwas unverständlich erklärt habe.
Ich habe ein Bild (siehe Bild: Test) beigefügt, damit du sehen kannst, was das Ergebnis ist.
Ich habe mal das, was ich herausbekommen will, manuell erstellt (síehe Bild: test2). Z.B. Auto kommt in beiden Spalten vor, deshalb wird die Anzahl von Auto addiert usw.:
Ich habe es mal so hinbekommen wie ich es gerne haben möchte. Leider ist der Code sehr umständlich. Könnt Ihr mir vielleicht Verbesserungsvorschläge machen, wie man den Code geschickter machen könnte oder kennt ihr vielleicht einen anderen schnelleren Weg, der das Problem löst.
Der Code läuft nur für das genannte Beispiel. Wenn ich mal 3 oder mehrere Spalten miteinander vergleichen müsste, wäre das schon sehr viel mehr schreibarbeit in Matlab.
Bin Anfänger und kenne mich leider noch garnicht so gut aus mit MATLAB...
Code:
%% Testen, wie man tabellen zusammenführen kann
Spalte_Artikel_one =[{'Auto'};{'Laptop'};{'Fernseher'}];
Spalte_Artikel_Anzahl_one = num2cell([1; 5 ; 3]);
Table = [Spalte_Artikel_one,Spalte_Artikel_Anzahl_one;Spalte_Artikel_two,Spalte_Artikel_Anzahl_two]; % Zunächst füge ich die Spalten zusammen
u = unique(Table(:,1)); % Hier werden alle doppelten oder mehrfach vorkommenden Einträge (Artikel) entfernt % [row,col] = size(u);
%%%%%%%
%%%%%%% Ab Hier müsste es doch einfacher möglich sein...oder??
%%%%%%%
content1 = u(1,1); % Die einzelnen Zeilennamen aus der neu erstellten Tabelle u entnehmen
content2 = u(2,1);
content3 = u(3,1);
content4 = u(4,1);
[Zeilea,Spaltea] = find(strcmp([Spalte_Artikel_one,Spalte_Artikel_two],content1)); % Zeile und Spalte suchen, wo diese Zeilennamen in den ursprünglichen Tabellen vorkommen [Zeileb,Spalteb] = find(strcmp([Spalte_Artikel_one,Spalte_Artikel_two],content2));
[Zeilec,Spaltec] = find(strcmp([Spalte_Artikel_one,Spalte_Artikel_two],content3));
[Zeiled,Spalted] = find(strcmp([Spalte_Artikel_one,Spalte_Artikel_two],content4));
if a == 1% je nachdem, ob der Artikel(z.B. Auto) nur in einer Tabelle oder in beiden Tabellen vorkommt, wird die dazugehörige Anzahl addiert.
Gesamtanzahl_a = Spalte_Artikel_Anzahl_one{Zeilea(1)};
elseif a == 2
Gesamtanzahl_a = Spalte_Artikel_Anzahl_one{Zeilea(1)} + Spalte_Artikel_Anzahl_two{Zeilea(2)};
end
if b == 1
Gesamtanzahl_b = Spalte_Artikel_Anzahl_one{Zeileb(1)};
elseif b == 2
Gesamtanzahl_b = Spalte_Artikel_Anzahl_one{Zeileb(1)} + Spalte_Artikel_Anzahl_two{Zeileb(2)};
end
if c == 1
Gesamtanzahl_c = Spalte_Artikel_Anzahl_one{Zeilec(1)};
elseif c == 2
Gesamtanzahl_c = Spalte_Artikel_Anzahl_one{Zeilec(1)} + Spalte_Artikel_Anzahl_two{Zeilec(2)};
end
if d == 1
Gesamtanzahl_d = Spalte_Artikel_Anzahl_one{Zeiled(1)};
elseif d == 2
Gesamtanzahl_d = Spalte_Artikel_Anzahl_one{Zeiled(1)} + Spalte_Artikel_Anzahl_two{Zeiled(2)};
end
Gesamtanzahl_tabelle = num2cell([Gesamtanzahl_a; Gesamtanzahl_b; Gesamtanzahl_c; Gesamtanzahl_d]); % Tabelle mit den addierten Werten wird erstellt
Fertige_Tabelle_zum_plotten = [u,Gesamtanzahl_tabelle]; % die Tabelle, die ich haben möchte ist endlich fertig
[row,col]=size(Fertige_Tabelle_zum_plotten(:,1)); % plot barh(cell2mat(Fertige_Tabelle_zum_plotten(:,2)));
set(gca, 'YTickLabel', Fertige_Tabelle_zum_plotten(:,1),'YTick',1:row);
hold on
Das ist genau das was ich gesucht habe. Echt Klasse
Einstellungen und Berechtigungen
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.