Quelle est l'utilité de qui?

Je suis en train d'essayer d'obtenir une poignée sur l'omniprésent which fonction. Jusqu'à ce que j'ai commencé à lire les questions/réponses sur DONC je n'ai jamais trouvé l'utilité. Et je ne comprends toujours pas.

Comme je le comprends, which prend une valeur de type Boolean vecteur et renvoie un faiblement plus court vecteur contenant les indices des éléments qui ont été remplies:

> seq(10)
 [1]  1  2  3  4  5  6  7  8  9 10
> x <- seq(10)
> tf <- (x == 6 | x == 8)
> tf
 [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE
> w <- which(tf)
> w
[1] 6 8

Alors pourquoi aurais-je jamais utiliser which au lieu de simplement en utilisant le vecteur Booléen directement? Je pourrais peut-être voir certains des problèmes de mémoire avec d'énormes vecteurs, depuis length(w) << length(tf), mais ce n'est guère convaincante. Et il y a des options dans le fichier d'aide qui n'ajoute pas beaucoup à ma compréhension des utilisations possibles de cette fonction. Les exemples dans le fichier d'aide ne sont pas d'une grande aide non plus.

Modifier pour plus de clarté-- je comprends que le which retourne les indices. Ma question est à propos de deux choses: 1) pourquoi vous avez besoin pour l'utilisation des indices au lieu de simplement en utilisant l'opérateur booléen sélecteur de vecteur? et 2) quels comportements intéressants de which pourrait rendre préféré tout simplement à l'aide d'un vectorisé Boolean comparaison?

  • bibliothèque(la fortune) fortune(175)
  • Juste, mais pas la plus importante d'exemples ;-). Vous pouvez effectivement donner fortune() un qui vecteur, mais il faut tout simplement le premier élément: if (length(which) > 1) which <- which[1]
  • J'ai juste pensé que c'était drôle
  • Donc, ne I. Ainsi, l' ;-)... 🙂
  • J'aime les discussions de ce genre, une grande question. Me fait toujours penser à. J'utilise souvent ce qui même si je n'ai pas besoin de cause j'aime l'idée de l'alimentation dans le vecteur d'indices plutôt que de VRAI/FAUX pour une raison quelconque.
  • Je trouve la question étrange, il est utile depuis que je l'utilise tout le temps! Parfois, vous voulez les chiffres réels, parfois une logique de vecteur de même longueur - une évidente est de sorte que vous pouvez effectuer à la "ID" à d'autres ensembles de données comme vous le sous-ensemble et ainsi de suite. Ou, une logique de vecteur n'est pas très utile si vous voulez éléments avant et après une en particulier. diff() dans la() des valeurs est également bon pour la cueillette des lacunes et des modèles etc.
  • C'est à l'aide de tout le temps qu'invité la question: les gens semblent l'utiliser même lorsque l'OMI (plus lisible) boolean alternative fonctionne tout aussi bien. Donc je me demandais si il y a quelque chose de plus passe ici. La question a apporté quelques astuces intéressantes, y compris votre diff(which()), donc je suis assez content que je l'avais demandé.
  • J'ai du mal à comprendre comment tout un usage sérieux de la R peut se produire sans parfois les numéros de parfois des booléens. Je suis tenté de demander comment vous en sortir sans elle - même si elle est assez facile à remplacer pour un compromis avec : et [.
  • Pas un qui a vu mon aurait pu l'appeler grave. C'est pourquoi on appelle ces gens qui paient pour des trucs Bailleurs de fonds 🙂
  • J'ai eu du mal à choisir ce terme, on jouait à "long terme" et la je trouve qu'il est fondamental est le point, comme vous le feriez dans le dégoût à l'aide de R si vous avez été constamment essayer de persister avec l'opérateur booléen indexation exclusivement. C'est TELLEMENT utile que je ne comprends pas la question ici, bien que j'apprécie l'exercice de l'idée à la détail le contraste.
  • Je pense que c'est une technique intéressante, mais je vous jure que je n'ai pas utilisé une seule fois encore. Maintenant que j'ai vu des trucs intéressants avec elle et, en outre, avoir une grande philosophie (joran utilisation which quand vous avez besoin d'accéder à des éléments dont les positions sont fonction de la position des autres éléments"), je vais probablement l'utiliser beaucoup plus.