2011-08-05 3 views
2

Parce que je travaille avec une table très complexe avec des valeurs répétées désagréables dans des endroits variables, je voudrais faire une recherche de chaîne entre des lignes et des colonnes spécifiques.Spécifier la colonne et la ligne d'une recherche de chaîne

Par exemple:

table={{"header1", "header2", "header3", 
"header4"}, {"falsepositive", "falsepositive", "name1", 
"falsepositive"}, {"falsepositive", "falsepositive", "name2", 
"falsepositive"}, {"falsepositive", "falsepositive", 
"falsepositive", "falsepositive"}} 

%//TableForm= 
header1   header1   header1   header1 
falsepositive falsepositive name1   falsepositive 
falsepositive falsepositive name2   falsepositive 
falsepositive falsepositive falsepositive falsepositive 

Comment rechercher une chaîne, par exemple, dans la troisième colonne, les lignes un à deux?

Je souhaite utiliser Which pour affecter des valeurs en fonction de l'emplacement d'une chaîne dans la table.

Par ex,

Which[string matched in location one, value, matched in location two, value2] 

Répondre

5

Si je comprends bien vous voulez un test si oui ou non une chaîne donnée est dans un certain paragraphe d'une matrice. Vous pouvez choisir ces sous-sections en utilisant Part ([[]]]) et Span (;;), avec lesquelles vous pouvez indiquer des plages ou des sous-échantillons de plages. Vérifier si oui ou non ce paragraphe contient votre modèle peut être fait par MemberQ, comme ceci:

MemberQ[table[[1 ;; 2, 3]], "name2"] 

(* ==> False *) 

MemberQ[table[[1 ;; 2, 3]], "header3"] 

(* ==> True *) 

De cette façon, votre déclaration Which pourrait ressembler à ceci:

myVar = 
Which[ 
    MemberQ[table[[1 ;; 2, 3]], "name2"], 5, 
    MemberQ[table[[2 ;; 3, 4]], "falsepositive"], 6, 
    ... 
    True, 20 
    ] 
+0

Voir le commentaire dans ma réponse –

+0

Merci! J'apprécie vraiment cela! – Rose

1

Peut-être, si je vous comprends:

f[table_, value_, rowmin_, rowmax_, colmin_, colmax_] := 
Select[Position[table, value], 
    rowmin <= [email protected]# <= rowmax && colmin <= [email protected]# <= colmax &] 
f[table, "name1", 1, 10, 1, 10] 
(* 
-> {{2, 3}} 
*) 
+0

Je pense que cela fonctionnera; parce que je l'applique à 'Which' j'ai juste besoin d'un retour final de True/False sur si une chaîne est dans une spécification de ligne/colonne, mais un tweak devrait faire. Merci beaucoup! – Rose

+0

@Rose Je pense que vous ne devriez pas accepter ma réponse et accepter Sjoerd, car il a mieux compris votre exigence –

2
Length[Cases[Position[table, "name1"], {1 | 2, 3}]] >= 1 

Sortie -> vrai

Ou

Cases[Position[table, "name1"], {1 | 2, 3}] 

Sortie -> {{2, 3}}

Questions connexes