R fonctionne différemment, à deux égards.
for
boucles ne fonctionnent pas comme ça - vous ne pouvez pas modifier la variable de boucle, comme vous l'avez remarqué. De plus, vous ne faites généralement pas d'itération sur les index, mais plutôt sur les éléments directement.
Pour sélectionner ou supprimer des objets spécifiques d'un vecteur/matrix/data.frame, il vous suffit de sélectionner ces éléments via un index numérique ou logique. Votre code est déjà en cours dans ce sens, mais vous construisez cet indice (rowsToDelete
) itérativement plutôt que dans un aller
En corollaire (2), ne créent pas des vecteurs ou des listes dans une rangée par concaténation itérative - c'est vraiment, vraiment lent.
est ici d'une manière différente, en utilisant les expressions vectorisées de R:
rowsToDelete = data$reactionTime > 2000 | data$V8 < 9999
Notez que je l'ai remplacé ||
avec le vectorisée |
. Cela renvoie un vecteur dont les éléments sont TRUE
lorsque la condition est remplie. Ensuite, nous devons étendre ce vecteur logique tel que, si un élément à l'index i est TRUE
, les indices à i +1 et i 2 seront également TRUE
:
rowsToDelete = rowsToDelete | c(FALSE, rowsToDelete) | c(FALSE, FALSE, rowsToDelete)
Cette Il décale simplement le vecteur d'un élément, puis de deux éléments, et les combine via un «ou» logique. Cependant, notez que cela entraîne des avertissements, puisque maintenant les vecteurs que nous combinons via "ou" n'ont plus la même longueur. En général, c'est une bonne idée de tenir compte de cet avertissement. Nous pouvons l'éviter ici en utilisant une petite fonction d'assistance:
shift = function (x, element = FALSE) c(element, x[-length(x)])
rowsToDelete = data$reactionTime > 2000 | data$V8 < 9999
rowsToDelete = rowsToDelete | shift(rowsToDelete) | shift(shift(rowsToDelete))
Pouvez-vous décrire exactement ce que vous essayez de faire? il peut y avoir une façon plus simple de le faire. (par exemple, obtenez quelles lignes remplissent les conditions et en déduire les lignes à supprimer). (nb: comme 'rowsToDelete' est un vecteur, utilisez' c (rowsToDelete, ...) 'au lieu de' rbind') – Cath