2017-02-11 4 views
-2

problème spécifique je suis la résolution:R Valeurs vecteur Écraser dans la fonction

Créer un vecteur de caractère avec la longueur du nombre de rangées-de-iris-ensemble de données, de telle sorte que, chaque élément obtient une valeur de caractère - "supérieur à 5" si le 'Sepal.Length' correspondant> 5, sinon il devrait être "inférieur à 5".

Cela fonctionne:

char_vect <- c(seq(1:nrow(iris))) 

for (i in char_vect) { 
    if (iris$Sepal.Length[i] > 5) { 
    char_vect[i] <- ("greater than 5") } else { 
     char_vect[i] <- ("less than 5") 
    } 
} 

Mais pour une raison quelconque, si je définis char_vect comme suit, je reçois des réponses drôles:

char_vect <- iris$Sepal.Length 

for (i in char_vect) { 
    if (iris$Sepal.Length[i] > 5) { 
    char_vect[i] <- ("greater than 5") } else { 
     char_vect[i] <- ("less than 5") 
    } 
} 

Bien que les vecteurs je commencer avec différentes dans Dans les deux cas, la fonction est la même et remplace les vecteurs d'origine. Leurs valeurs ne devraient-elles donc pas être pertinentes tant que leurs longueurs sont équivalentes?

Quand je regarde ce que la sortie de la deuxième option est, je suis encore plus confus car il ressemble à une fonction écrasait quelques-unes des valeurs d'origine, mais pas tous ...

Mon instinct me dit est-ce que cela a à voir avec le fait que l'option 1 définit char_vect comme des entiers alors que l'option 2 est numérique? Mais je ne comprends pas pourquoi un opérateur de comparaison ne fonctionnerait pas de manière égale sur les nombres entiers et numériques. En regardant la sortie de l'option 2, il semble aussi y avoir des entiers sur lesquels la fonction n'a pas fonctionné.

merci beaucoup d'un novice R!

+0

Voir aussi la fonction 'ifelse'. –

+0

'i dans char_vect':' i' n'est pas un index numérique dans le second cas mais vous l'utilisez toujours comme un seul. – nrussell

+0

merci à tous, évidemment avoir plus à apprendre - n'a pas pensé à travers les différences dans l'indexation de char_vect btwn. options 1 et 2 – ajuey

Répondre

-1

Votre deuxième version n'a pas vraiment de sens. Vous pouvez voir que, en changeant le corps de votre boucle comme ceci:

char_vect <- iris$Sepal.Length 
for (i in char_vect) { 
    cat(i, "\n") 
} 
5.1 
4.9 
4.7 
4.6 
5 
5.4 
... Output truncated 

Ce sont les valeurs de i que vous mettez dans iris$Sepal.Length[i] et char_vect[i].