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.
Vous devez vous connecter pour publier un commentaire.
Ok, c'est quelque chose où il s'est avéré utile la nuit dernière:
Dans un vecteur des valeurs de ce qui est l'indice de la 3ème non NA de valeur?
Un peu différente de DWin de l'utiliser, même si j'avais dis qu'il est impérieux trop!
Le titre de la page de man
?which
fournit une motivation. Le titre est:Qui j'interprète comme étant la fonction, on peut utiliser si vous voulez savoir qui éléments d'une logique de vecteur sont
TRUE
. C'est intrinsèquement différent simplement en utilisant la logique du vecteur lui-même. Qui permettrait de sélectionner les éléments qui sontTRUE
, de ne pas vous dire lequel d'entre eux étaitTRUE
.Cas d'utilisation courants ont été les position de le maximum ou le minimum des valeurs dans un vecteur:
Ceux qui ont été tellement utilisés qu'
which.max()
etwhich.min()
ont été créés:Cependant, veuillez noter que les formulaires ne sont pas exactes de remplacement pour la forme générique. Voir
?which.min
pour plus de détails. Un exemple ci-dessous:x[which.max(x)]
avant et l'a trouvé à portée de main. Mais je l'ai trouvé très pratique, car il a sauvé tapantx[x==max(x)]
. En d'autres termes, parce que c'était un raccourci pas parce qu'il y avait une raison que j'avais besoin de la position au lieu de la valeur de type Boolean. Ce que le fait d'avoir un vecteur de positions vous un vecteur de Booléens?NA
d'affaires de la DWin mentionné. Envisager lax
de mon exemple:x[4] <- NA
puis essayezx[x == max(x, na.rm = TRUE)]
. Certaines personnes considèrent laNA
dans le retour de l'laid.na.rm
semble être le principal point en sa faveur. Bien que dans des cas particuliers, je peux voir réellement avoir besoin d'indices avec la partie moyenne de @doroczig de réponse.Deux des raisons impérieuses de ne pas oublier
which
:1) Lorsque vous utilisez "[" pour extraire à partir d'un dataframe, calcul de la position de ligne que les résultats de la NA obtiendrez une ordure ligne retournée. À l'aide de
which
supprime le NA. Vous pouvez utilisersubset
ou%in%
, qui ne créent pas le même problème.2) Quand vous avez besoin le tableau des indicateurs.
which
pourrait être utile (par le moyen de sauver à la fois l'ordinateur et des ressources humaines) par exemple, si vous devez filtrer les éléments d'une trame de données/de la matrice par une variable donnée/colonne et mettre à jour d'autres variables/colonnes sur cette base. Exemple:Au lieu de:
Que vous pouvez faire:
Supplémentaire, ce serait le cas si vous avez de filtrer les éléments filtrés ce qui pouvait être fait avec un simple
&
ou|
, par exemple lorsque vous devez mettre à jour certaines parties d'un bloc de données basées sur d'autres tableaux de données. De cette manière, il est nécessaire de stocker (au moins temporaire) de l'index de l'élément filtré.Une autre question qu'est-ce cames à mon esprit, si vous avez de la boucle de la pensée d'une partie d'un bloc de données/de la matrice ou de faire d'autres genre de transformations nécessitant de connaître les indices de plusieurs cas. Exemple:
Désolé pour le mannequin exemples, je sais que ça fait pas beaucoup de sens de comparer la plus urbanisée des états des états-unis par les états avant ceux de l'alphabet, mais j'espère que cela a un sens 🙂
Vérifier
which.min
etwhich.max
donne une certaine idée aussi, que vous n'avez pas à taper beaucoup, exemple:p <- ( df$hp > 150 )
. Pas de parens nécessaire; je viens de m'aimez pour plus de clarté. J'aime l'utilisation deurban-1
bien. Peut voir un endroit où peut-être, tout est en ordre alphabétique et que vous souhaitez l'entrée précédente, ou c'est triée dans l'ordre croissant et que vous souhaitez l'entrée précédente, ou quelque chose comme ça.urban - 1
exemple (même si c'est un cas très simple). @gsk3 Il y aura des cas où vous avez besoin d'accéder à des éléments dont les positions sont un function de la positions d'autres éléments. Le vecteur booléen ne l'aide pas beaucoup là. Bien sûr, comment souvent ce type de situation se produit dépendra de ce que vous faites. 😉Bien, j'ai trouvé une raison possible. Au début, j'ai pensé qu'il pourrait être le
,useNames
option, mais il s'avère que booléenne simple sélection n'a que trop.Toutefois, si votre objet d'intérêt est une matrice, vous pouvez utiliser le
,arr.ind
option pour retourner le résultat sous la forme (ligne,colonne) paires commandées:C'est un truc utile à connaître, mais ne semble guère à justifier de son utilisation constante.
arr.ind
Surpris personne n'a répondu à cette question: quelle est l'efficacité de mémoire?
Si vous avez une longue vecteur de très rares
TRUE
's, puis en gardant la trace de seulement les indices de la valeur réelle sera probablement beaucoup plus compact.Je l'utilise assez souvent dans l'exploration de données. Par exemple si j'ai un dataset de les enfants, de données et de voir à partir résumé que l'âge maximum est de 23 (et devrait être de 18 ans), j'irai peut-être:
Si c'était de 67, et j'ai voulu regarder de plus près, je pourrais utiliser:
Également utile si vous faites une présentation et une envie de sortir un extrait de données pour démontrer une certaine bizarrerie ou ce n'est pas.
head(dat[dat$age>18,])
est généralement la façon dont je le ferais, mais sur des données de test.cadre je viens de jouer avec c'est deux fois plus lent.head(dat[dat$age>18,])
je recevrais pas d'où rapide.which
de mon sac de trucs et astuces pour l'optimisation de la vitesse....