fast delete of rows in a table

3 visualizaciones (últimos 30 días)
Francesco Giuseppe Fornari
Francesco Giuseppe Fornari el 27 de Mayo de 2020
Comentada: Francesco Giuseppe Fornari el 27 de Mayo de 2020
hi
I've got a table with 120k rows, and I need to delete some rows if there is a specific condition.
I wrote this:
for i=1:(size(db,1)-1)
if db.INTERVENTION(i)==1 && isequal(db.SETTLEMENTDATE(i-1),db.SETTLEMENTDATE(i)) && isequal(db.DUID(i-1),db.DUID(i))
db(i-1,:)=[];
end
end
This code takes a long time to execute.
Is there a faster way?
thanks!

Respuesta aceptada

Image Analyst
Image Analyst el 27 de Mayo de 2020
Try this:
numRows = size(db,1)-1;
rowsToDelete = false(numRows, 1);
for k = 2 : numRows % Has to start at 2, right? Since you're using k-1. Don't use i, the imaginary variable, as a loop index.
if db.INTERVENTION(k)==1 && isequal(db.SETTLEMENTDATE(k-1),db.SETTLEMENTDATE(k)) && isequal(db.DUID(k-1),db.DUID(k))
rowsToDelete(k) = true;
end
end
db(rowsToDelete, :) = []; % Remove these rows.
% Or equivalently
%db = db(~rowsToDelete, :); % Extract everything BUT the rows to delete.
  3 comentarios
Image Analyst
Image Analyst el 27 de Mayo de 2020
I think the reason being is that when you removed a single row from the table, it had to rebuild the table each time. If you give it a vector, it has to rebuild the table only once.
Francesco Giuseppe Fornari
Francesco Giuseppe Fornari el 27 de Mayo de 2020
yes, it makes a lot of sense ;)

Iniciar sesión para comentar.

Más respuestas (1)

darova
darova el 27 de Mayo de 2020
Write indices and delete outside the for loop
ind = logical(db*0);
for i=1:(size(db,1)-1)
if db.INTERVENTION(i)==1 && isequal(db.SETTLEMENTDATE(i-1),db.SETTLEMENTDATE(i)) && isequal(db.DUID(i-1),db.DUID(i))
ind(i,:) = true;
end
end
db(ind) = [];
  2 comentarios
Francesco Giuseppe Fornari
Francesco Giuseppe Fornari el 27 de Mayo de 2020
seems ok, but I don't get the inizialization of ind. Line
ind = logical(db*0);
gives "Undefined operator '*' for input arguments of type 'table'"
Did I got wrong?
Thanks anyway!
darova
darova el 27 de Mayo de 2020
See Image Analyst answer below. It's correct

Iniciar sesión para comentar.

Categorías

Más información sobre Logical en Help Center y File Exchange.

Productos


Versión

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by