How do I delete a row in a table containing certain text?

11 vues (au cours des 30 derniers jours)
Nina Nikolova
Nina Nikolova le 22 Jan 2019
Modifié(e) : Jan le 27 Jan 2021
Hi, I am very new to MATLAB and I have been reading all the help and I do not understand where my code is wrong. I need to simply delete a row of my table 'indices' which contains the text 'Totals:'.
Below is an excerpt of my table 'indices' (originally 18x9) and I want to delete the row with the Total:, i.e the last row (or row 18).
CalendarYear Premium
'2017' 35216284
'2018' 36432973
'2019' 37895599
'Total:' 428730614
I tired several things in order to find the row number or the location where the word Total is without success:
1.
>> isequal(indices.CalendarYear,'Total:')
ans =
logical
0
2.
>> strcmp(indices(:,1),'Total:')
ans =
logical
0
3. This gives me a logical output but then I do not know how to continue using it
>> strfind(indices.CalendarYear,'Total:')
ans =
18×1 cell array
{0×0 double}
.........
{[ 1]} %finally a positive answer
none of these attempts gives me the row number 18 which I wold like to delete form my table.
What am I missing?
Thank you in advance,
ni7

Réponse acceptée

Jan
Jan le 22 Jan 2019
Modifié(e) : Jan le 27 Jan 2021
You are almost there.
isequal(indices.CalendarYear, 'Total:')
This tests, if indices.CalenderYear is equal to the char vector 'Total:'. This cannot be equal.
strcmp(indices(:,1), 'Total:')
This is almost working. Use braces instead
strcmp(indices{:,1}, 'Total:')
% Or to get the index:
find(strcmp(indices{:,1}, 'Total:'))
Or equivalently (I prefer this!):
find(strcmp(indices.CalendarYear, 'Total:'))
The command:
strfind(indices.CalendarYear, 'Total:')
searchs, where the part 'Total:' appears, not if the string equals this exactly. But as long as you do not have a 'not Total:' anywhere, this would work also:
find(~cellfun('isempty', strfind(indices.CalendarYear, 'Total:'))) % [TYPO FIXED]
[EDITED] Use contains in modern Matlab versions:
find(contains(indices.CalendarYear, 'Total:'))
  2 commentaires
Nina Nikolova
Nina Nikolova le 22 Jan 2019
Modifié(e) : Nina Nikolova le 22 Jan 2019
Thank you, @Jan, for the educational answer. I still need to understand better the concept of the different brackets and braces. The solution worked perfect!
Stefan Grandl
Stefan Grandl le 26 Jan 2021
Perfect answer, thanks!
Just a remark: in Jan's last answer there is a final parenthesis missing at the end. It should be:
find(~cellfun('isempty', strfind(indices.CalendarYear, 'Total:')))

Connectez-vous pour commenter.

Plus de réponses (2)

Luna
Luna le 22 Jan 2019
Hi Nina,
You can use this code below:
myTable = table({'2017','2018','2019','Total:'}',[35216284,36432973,37895599,428730614]','VariableNames',{'CalendarYear','Premium'});
reducedTable = myTable(~contains(myTable.CalendarYear,'Total:'),:);
  5 commentaires
Nina Nikolova
Nina Nikolova le 22 Jan 2019
Modifié(e) : Nina Nikolova le 22 Jan 2019
Dear @Luna, thank you for showing another efficient way, this is all so beneficial for my learning!
Luna
Luna le 22 Jan 2019
Your welcome :)

Connectez-vous pour commenter.


madhan ravi
madhan ravi le 22 Jan 2019
Another possibility using regexp but not as effective as the above two answers:
k=cellfun(@(x)regexp(x,'Total:'),T.CalendarYear,'un',0) % T is your table
T(~cellfun(@any,k),:)

Catégories

En savoir plus sur Tables dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by