2017-03-08 4 views
0

Je souhaite remplacer les valeurs numériques par des chaînes. la plage numérique est comprise entre -1 et 1 mon dput d'un df est ci-dessous.L'extraction avec des inégalités négatives renvoie des valeurs incorrectes

structure(list(m = c(-0.226, 0.11, 0.143, -0.095, -0.007, -0.232, 
-0.258, -0.438, -0.199, -0.419, -0.41, -0.271, -0.176, -0.33, 
-0.335, -0.59, -0.724, -0.161, -0.237, -0.223, -0.041, -0.627, 
-0.37, 0.055, -0.215, -0.287, -0.378, 0.006, -0.381, -0.598, 
-0.179, -0.259, 0.147, -0.08, 0.172, 0.035, -0.458, -0.254, -0.373, 
-0.319)), .Names = "m", row.names = c(NA, -40L), class = "data.frame") 

Lorsque je lance le code ci-dessous, il ne donne pas le résultat escompté.

m[m >= 0.3] <- "a" 
m[(m < 0.3 & m >= 0.2)] <- "b" 
m[(m < 0.2 & m >= 0.1)] <- "c" 
m[(m < 0.1 & m >= 0.05)] <- "d" 
m[(m < 0.05 & m >= 0)] <- "e" 
m[(m < 0 & m >= -0.05)] <- "f" 
m[(m < -0.05 & m >= -0.1)] <- "g" 
m[(m < -0.1 & m >= -0.2)] <- "h" 
m[(m < -0.2 & m >= -0.3)] <- "i" 
m[m < -0.3] <- "j" 

J'ai aussi essayé avec l'ajout d'un « » à la fin comme ci-dessous:

m[m < -0.3,] <- "j" 

Je crois que le code est assez explicite: je voudrais changer les valeurs dans une plage par une chaîne de caractères. L'inégalité avec des valeurs négatives ne semble pas fonctionner ...

Merci.

+1

un coup d'oeil à 'cut'?. –

+0

@DavidArenburg coupe fait l'affaire mais fonctionne pour les vecteurs numériques, j'ai dataframe ... merci – Chrisftw

+1

Une trame de données est juste un vecteur (liste) de vecteurs. En R, pratiquement tout est un vecteur. Donc 'df $ m' est aussi un vecteur. –

Répondre

1

Ceci est votre problème:

> -1 < -2 
[1] FALSE 
> "-1" < "-2" 
[1] TRUE 

Puisque vous remplacez des nombres avec des chaînes dans la même variable, les numéros seront contraints à des chaînes. Par conséquent, les inégalités avec des nombres négatifs donneront des résultats erronés.

Ce que je recommanderais est d'utiliser une deuxième variable m2 pour stocker les changements et garder m intact.

m2 = m 

m2[m >= 0.3] <- "a" 
m2[(m < 0.3 & m >= 0.2)] <- "b" 
m2[(m < 0.2 & m >= 0.1)] <- "c" 
m2[(m < 0.1 & m >= 0.05)] <- "d" 
m2[(m < 0.05 & m >= 0)] <- "e" 
m2[(m < 0 & m >= -0.05)] <- "f" 
m2[(m < -0.05 & m >= -0.1)] <- "g" 
m2[(m < -0.1 & m >= -0.2)] <- "h" 
m2[(m < -0.2 & m >= -0.3)] <- "i" 
m2[m < -0.3] <- "j" 

Résultat:

> m2 
    m 
1 i 
2 c 
3 c 
4 g 
5 f 
6 i 
7 i 
8 j 
9 h 
10 j 
11 j 
12 i 
13 h 
14 j 
15 j 
16 j 
17 j 
18 h 
19 i 
20 i 
21 f 
22 j 
23 j 
24 d 
25 i 
26 i 
27 j 
28 e 
29 j 
30 j 
31 h 
32 i 
33 c 
34 g 
35 c 
36 e 
37 j 
38 i 
39 j 
40 j 
+0

merci, très apprécié, ne savais pas à propos de votre première déclaration – Chrisftw