Logical indexing: Find row in table by text in column
    60 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Moshe Flam
 el 6 de Feb. de 2018
  
    
    
    
    
    Respondida: Kristupas Karcemarskas
 el 17 de Abr. de 2022
                a = {'hi', 'bye'; 'don', 'tcry' };
    t = array2table(a);
    u = t(t.a1 == 'don', :);  % error: Undefined operator '==' for cell
How do I do a logical search for the row where a1 is 'bye'?
If it was numbers, it would be easy:
    b = [1,2 ; 3,4];
    q = array2table(b);
    r = q(b1 == 3, :); # works perfectly
OK I found one way: Use string().
    g = t(string(t.a1)=="don", :);  % works!  ;-)
Are there other ways, better ways, nicer ways?
1 comentario
Respuesta aceptada
  Star Strider
      
      
 el 6 de Feb. de 2018
        u = t(strcmp(t.a1, 'don'), :);
u =
    1×2 table
       a1        a2  
      _____    ______
      'don'    'tcry'
2 comentarios
  KAE
      
 el 20 de Jun. de 2019
				Just another way to use Star Strider's solution. If you want the index to the row containing your desired value,
iRow = find(strcmp(t.a1, 'don')==1);
  Guillaume
      
      
 el 21 de Jun. de 2019
				Note that beginners tend to use find more than they should, you typically see:
indices = find(somearray == somevalue);
result = somerarray(indices);
where find wasn't needed at all and was just a waste of time:
isfound = somearray == somevalue;
result = somearray(isfound);
It's actually rare that you do need the indices.
Más respuestas (4)
  Kristupas Karcemarskas
 el 17 de Abr. de 2022
        I found that it is really easy to use categorise() function
for example:
u=categorise(u);
0 comentarios
  Peter Perkins
    
 el 7 de Feb. de 2018
        Two other things worth considering:
1) if {'hi', 'bye'; 'don', 'tcry'} are always unique, consider making them row names. Then t('don', :) is what you would use.
2) If {'hi', 'bye'; 'don', 'tcry'} could be a large list of repeated values, consider making them a categorical vector. Then u = t(t.a1 == 'don', :) is what you would use.
But even if those are not an option, if you are using R2016b or later, consider using a string array instead of a cellstr, as Guillaume says.
2 comentarios
  Peter Perkins
    
 el 12 de Feb. de 2018
				To make them row names, it's just
r.Properties.RowNames = t.a1;
t.a1 = []; % delete the original variable
but if the data are coming from a file you may well be able to read them in as row names. See the doc for readtable.
To make a categorical, it's just
t.a1 = categorical(t.a1)
but you will probably want to look over the documentation for categorical arrays. Once t.a1 is categorical, you can use ==. It's not the main reason for using categoricals, but it's a convenience (one that string also provides).
Ver también
Categorías
				Más información sobre Characters and Strings 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!






