2016-06-21 2 views
-1

J'essaie de remplacer certaines plages de température par «froid», «med» ou «chaud», et je ne sais pas comment résoudre mon problème. L'ensemble de données est nommé "stats" et la température est "temp1".Remplacer les valeurs vectorielles par des noms

tmp1<-stats$temp1 
lesser<-stats[stats$temp1<=11,] 
inbetween<-stats[stats$temp1>11 & stats$temp1<22,] 
greater<-stats[stats$temp1>=22,] 
stats$temp2<-replace(tmp1, c("lesser", "inbetween", "greater"), c("cold","med","hot")) 

L'erreur que je continue à obtenir est la suivante:

Erreur dans `< $ remplacement -.data.frame a 1095 lignes, les données ont 1092

J'ai plusieurs agences nationales, mais plus de 1095-1092 = 3 valeurs

+2

Bienvenue dans Stack Overflow! S'il vous plaît lire les informations sur [comment poser une bonne question] (http://stackoverflow.com/help/how-to-ask) et comment donner un [exemple reproductible] (http://stackoverflow.com/questions/ 5963269). Cela rendra beaucoup plus facile pour les autres de vous aider. – zx8754

+0

'stats' est le nom d'un paquetage, donc je ne l'utiliserais pas comme nom de variable. – N8TRO

+0

Mais si vous insistez: 'stats $ temp2 <- ifelse (statistiques $ temp1 <= 11," froid ", ifelse (stats $ temp1> = 22," chaud "," med "))' – N8TRO

Répondre

2

@ zx8754 et @ N8TRO fournissent de bonnes solutions (en particulier cut). En voici un autre, avec un exemple reproductible.

set.seed(357) 
xy <- data.frame(temp = sample(0:50, size = 30, replace = TRUE)) 

xy[xy$temp <= 10, "feel"] <- "cold" 

xy[xy$temp > 10 & xy$temp < 30, "feel"] <- "ok" 

xy[xy$temp >= 30, "feel"] <- "hothothot" 

> head(xy) 
    temp  feel 
1 5  cold 
2 2  cold 
3 14  ok 
4 11  ok 
5 33 hothothot 
6 23  ok 
+1

Alternativement, vous pouvez initialiser 'feel' avec" ok "et ensuite faire deux sous-affectations pour' cold' et 'hothothot' –

+0

@docendodiscimus true, mais je voulais le faire de cette façon pour avoir des NA pour vérifier l'état de santé Dans le cas contraire, aucune valeur n'est prise en compte. –

+0

Je vois ce que vous voulez dire, c'est un point valable –

2

Nous pouvons utiliser cut() et ajouter des étiquettes comme ci-dessous:

stats$temp2 <- cut(stats$temp1, c(0, 11, 22, Inf), labels = c("cold", "med", "hot")) 

Remarque que cette colonne résultante est factor, si vous avez besoin d'être un character alors nous aurons besoin de l'envelopper dans as.character().