I have a large table (23000000x11) and want to extract rows from the table based on values in the 5th column.
for example the data looks like:
66172 8:17 1 2 1 1 1 1 1 6 8
66842 7:17 1 3 0 1 1 1 1 1 7
.
.
.
and I want to create a smaller table with all the rows whose value of the fifth column are 0. This is of course easy to do with for loops and if statements, but takes enormous amounts of time to run. Is there a way using maybe ismember, intersect, or some other means to carry this out. I'm sure there must be. Any suggestions are appreciated.

 채택된 답변

Walter Roberson
Walter Roberson 2022년 9월 30일

0 개 추천

mask = YourTable{:, 5} == 0;
subset0 = YourTable(mask, :);

댓글 수: 3

Mark Bodner
Mark Bodner 2022년 9월 30일
Thanks Walter. Amazing answers as always!
For the first line of code dot would be much faster than brace.
mask = YourTable.varName == 0; % if you know the name of your fifth variable
mask = YourTable.(5) == 0; % if you dont know the name.
I was curious about the timing.
In my tests, the first 5 or so {:,5} accesses were reliably much slower than the others, so I skip those in the plot.
I must admit that I do not understand why {:,5} would be 5 or 6 times slower than .(5)
format long g
YourTable = array2table(randi(9, 5000, 7), 'VariableNames', {'a', 'b', 'c', 'd', 'e', 'f', 'g'});
N = 50;
skip = 7;
time_brace = zeros(N,1);
time_named = zeros(N,1);
time_dotnum = zeros(N,1);
for K = 1 : N
tic; YourTable.(5); t=toc(); time_dotnum(K) = t;
tic; YourTable{:,5}; t=toc(); time_brace(K) = t;
tic; YourTable.e; t=toc(); time_named(K) = t;
end
subset = [time_brace(skip+1:end), time_named(skip+1:end), time_dotnum(skip+1:end)];
plot(subset);
legend({'\{:,5\}', '.e', '.(5)'})
mean(subset)
ans = 1×3
1.0e+00 * 7.27209302325581e-05 1.4046511627907e-05 1.01627906976744e-05

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Logical에 대해 자세히 알아보기

제품

릴리스

R2022a

질문:

2022년 9월 30일

댓글:

2022년 10월 11일

Community Treasure Hunt

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

Start Hunting!

Translated by