How to delete a row of a table in a loop while indices are changing
5 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Johnny
el 28 de Nov. de 2016
Comentada: Johnny
el 29 de Nov. de 2016
I would like to do a comparison of a value with a previous value of a variable which appears after every sixth values. And if this variable is the same, I would like to delete the whole row. But when I delete, the indices change and it no longer appears after sixth values. How do I delete a row in a loop when the indices are changing?
for i=7:length(table)
if isequal(table(i,9),table(i-6),9)
table(i,:)=[];
end
end
0 comentarios
Respuesta aceptada
Ryan Smith
el 28 de Nov. de 2016
Your provided code is a little unclear in what you want to compare. Your conditional should always return 0, as it is:
if isequal(table(i,9),table(i-6))
Assuming you mean:
if isequal(table(i,9),table(i-6,9))
Furthermore, table(i,9) = []; just deletes a single cell of table, not the entire row.
Nonetheless, you might could try unique(). https://de.mathworks.com/help/matlab/ref/unique.html
But unique will compare your entire list/table. It might be best to just use a second array:
A = table(1:6,:);
j = 7;
for i=7:length(table)
if table(i,9) ~= table(i-6,9)
A(j,:)=table(i,:);
j = j + 1;
end
end
Hope this helps!
2 comentarios
Más respuestas (1)
Guillaume
el 28 de Nov. de 2016
From your comments, I'm going go out on a limb and assume that your (very badly named) table variable is actually not a table but a cell array. It can't be a table since the length function is not defined for tables.
Even for matrix and cell array, where length is defined, you shouldn't be using it since it will return either the number of rows or columns depending on which is greater. Use size with an explicit dimension.
If you want to use a loop to delete your rows, you have to store which rows you want to delete in the loop and perform the deletion at the end of the loop.
%somevariable: your badly named table variable renamed to something better
deleterow = false(size(somevariable, 1) %allocate array which tells us which row to delete
for row = 7: size(somevariable, 1) %use size instead of length
%to access the content of a cell of a cell array use {} not ().
%you can then compare with == assuming the content is scalar
if somevariable{i, 9} == somevariable{i-6, 9} %if not scalar then use isequal
deleterow(row) = true;
end
end
somevariable(deleterow, :) = []; %and delete all rows at once
If the content of column 9 is scalar, you don't even need a loop:
deleterow = cell2mat(somevariable(1:end-7)) == cell2mat(somevariable(7:end));
somevariable(deleterow, :) = [];
Ver también
Categorías
Más información sobre Data Type Identification en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!