How to write a loop for this case?
Mostrar comentarios más antiguos
Hello everyone,
I have a big table (25560 x 12) which includes data for 71 stations on a monthly bases from 30 years. I want to extract data from it based on the names (from station_name column) and month names (from date column). I want to save all results on the workspace as separate tables.
I searched a lot and write this code that does what I want for 2 stations but unfortunately, I should write it for all 71 stations (change names by hand) that is so time-consuming process. I want to ask if anyone could help me to do it using for loop or something.
%Read one of stations
Ahvaz_table = stations(stations.station_name == "Ahvaz", :);
%extract it month by month with name of month infront of station name:
Ahvaz_Jan = Ahvaz_table(month(Ahvaz_table.date) == 1, :)
Ahvaz_Feb = Ahvaz_table(month(Ahvaz_table.date) == 2, :)
Ahvaz_Mar = Ahvaz_table(month(Ahvaz_table.date) == 3, :)
Ahvaz_Apr = Ahvaz_table(month(Ahvaz_table.date) == 4, :)
Ahvaz_May = Ahvaz_table(month(Ahvaz_table.date) == 5, :)
Ahvaz_Jun = Ahvaz_table(month(Ahvaz_table.date) == 6, :)
Ahvaz_Jul = Ahvaz_table(month(Ahvaz_table.date) == 7, :)
Ahvaz_Aug = Ahvaz_table(month(Ahvaz_table.date) == 8, :)
Ahvaz_Sep = Ahvaz_table(month(Ahvaz_table.date) == 9, :)
Ahvaz_Oct = Ahvaz_table(month(Ahvaz_table.date) == 10, :)
Ahvaz_Nov = Ahvaz_table(month(Ahvaz_table.date) == 11, :)
Ahvaz_Dec = Ahvaz_table(month(Ahvaz_table.date) == 12, :)
%go to next station
Fasa_table = stations(stations.station_name == "Fasa", :);
%extract it month by month with name of month infront of station name:
Fasa_Jan = Fasa_table(month(Fasa_table.date) == 1, :)
Fasa_Feb = Fasa_table(month(Fasa_table.date) == 2, :)
Fasa_Mar = Fasa_table(month(Fasa_table.date) == 3, :)
Fasa_Apr = Fasa_table(month(Fasa_table.date) == 4, :)
Fasa_May = Fasa_table(month(Fasa_table.date) == 5, :)
Fasa_Jun = Fasa_table(month(Fasa_table.date) == 6, :)
Fasa_Jul = Fasa_table(month(Fasa_table.date) == 7, :)
Fasa_Aug = Fasa_table(month(Fasa_table.date) == 8, :)
Fasa_Sep = Fasa_table(month(Fasa_table.date) == 9, :)
Fasa_Oct = Fasa_table(month(Fasa_table.date) == 10, :)
Fasa_Nov = Fasa_table(month(Fasa_table.date) == 11, :)
Fasa_Dec = Fasa_table(month(Fasa_table.date) == 12, :)
% go to next station
.
.
.
Thank you all.
I attached my whole table.
5 comentarios
Adam Danz
el 26 de En. de 2020
This would be very easy if the tables were all stored in a cell array rather than as separate variables. I'm wondering how 71 different tables were created with different variable names. That process can most likely create a cell array of tables rather than 71 different, independent tables.
BN
el 26 de En. de 2020
Turlough Hughes
el 26 de En. de 2020
Just to note that the tables provided in the variable C contain a column entitled data (as opposed date) which seems to be a typo.
Adam Danz
el 26 de En. de 2020
If I recall correctly, I believe OP resolved that in a previous question.
Just in case that's still an issue, Behzad Navidi, this loop will rename the "data" column to "date" for all tables in C.
% Change "data" col to "date"
for i = 1:numel(C)
C{i}.Properties.VariableNames = strrep(C{1}.Properties.VariableNames,'data','date');
end
Stephen23
el 27 de En. de 2020
"I want to save all results on the workspace as separate tables."
And that is the start of the problem.
"... I should write it for all 71 stations (change names by hand) that is so time-consuming process."
Putting meta-data (such as month names) into variable names means that you are doing something wrong.
Repeating code is a sign that you are doing something wrong.
You should be using one array. Then access it in a loop using indexing, dynamic fieldnames, etc.
Respuesta aceptada
Más respuestas (2)
woahs
el 26 de En. de 2020
I'd recommend using structs and dynamic fieldnames instead of setting dynamic variable names for your station names and month. Give this a try and see if it does what you want.
finalStations = struct;
monthText = {'Jan' 'Feb', 'Mar', 'Apr', 'May', 'Jun', ...
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'};
stationNames = unique(stations.station_name);
for sx = 1:length(stationNames)
thisStation = stations(ismember(stations.station_name, stationNames{sx}), :);
adjustedStationName = matlab.lang.makeValidName(stationNames{sx});
for mx = 1:length(monthText)
finalStations.([adjustedStationName, '_', monthText{mx}]) = ...
thisStation(month(thisStation.date) == mx, :);
end
end
Turlough Hughes
el 26 de En. de 2020
Editada: Turlough Hughes
el 26 de En. de 2020
I was also taking the route of putting them into a structure with a fieldname for each month.
months = {'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'}
for ii = 1:12
data.(months{c})=cellfun(@(x) x(month(x.data) == ii, :),C,'UniformOutput',false);
end
1 comentario
Turlough Hughes
el 26 de En. de 2020
So data.Jan will have the exact same format as your original cell array but with only data from January of each year.
Categorías
Más información sobre Data Type Identification en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!