2010-11-18 23 views
3

En R J'essaie de supprimer des rangées dans une base de données (fourmis) qui ont une valeur négative dans la colonne intitulée Turbidité. J'ai essayéSupprimer des rangées avec des valeurs négatives

ants<-ants[ants$Turbidity<0,] 

mais il renvoie l'erreur suivante:

Warning message: 
In Ops.factor(ants$Turbidity, 0) : < not meaningful for factors 

Toutes les idées pourquoi cela peut être? Peut-être que je dois faire les valeurs négatives NA avant que je supprime toutes les NA?

Des idées très appréciées, merci!

@Joris résultat est:

str(ants$Turbidity) 

num [1: 291] -0,1 -0,2 0 0 -0,2 -0,5 0,1 -0,4 -0,2 0 ...

+1

Je pense que vous vouliez dire '>' quand vous écrivez '<'. – Marek

+0

Oui, vous avez raison, mon erreur, l'un des nombreux je pense! – Joey

+0

Je voulais dire les fourmis d'origine $ La turbidité, pas celle qui a été convertie. Celui que vous donnez ici ne peut pas donner cette erreur. Mais comme vous l'avez indiqué vous-même, utiliser 'header = T' semble le résoudre, alors ne vous embêtez pas. –

Répondre

3

Marek a raison, c'est un problème de données. Maintenant soyez prudent si vous utilisez [as.numeric (ants $ Turbidity), car celui-ci sera toujours positif.Il donne les niveaux de facteur (1 à longueur (ants $ Turbidité)), pas les facteurs numériques

Essayez ceci:..

tt <- as.numeric(as.character(ants$Turbidity)) 
which(!is.na(tt)) 

Il vous donnera une liste d'indices dont la valeur était pas numérique en premier lieu cela devrait vous permettre de nettoyer d'abord vos données

par exemple:

> Turbidity <- factor(c(1,2,3,4,5,6,7,8,9,0,"a")) 
> tt <- as.numeric(as.character(Turbidity)) 
Warning message: 
NAs introduced by coercion 
> which(is.na(tt)) 
[1] 11 

Vous ne devriez pas utiliser la structure as.numeric(as.character(...)) pour convertir des données problématiques, car cela générera des NA qui gâcheront le reste. Par exemple:

> Turbidity[tt > 5] 
[1] 6 7 8 9 <NA> 
Levels: 0 1 2 3 4 5 6 7 8 9 a 
+0

Merci Joris et Marek. J'ai exécuté ceci comme suggéré et en effet toutes mes rangées sont retournées en tant que caractère, au moins aucun n'est retourné comme numérique. Maintenant, j'ai établi que mes données sont complètement dans le mauvais format, pouvez-vous suggérer comment je peux les changer en valeurs numériques ou n'est-ce pas si simple? Merci beaucoup. – Joey

+0

@Joey: Donc vous voulez dire que, après quoi (! Is.na (tt)) vous obtenez une liste de 1 au nombre de lignes? Si oui, pourriez-vous mettre la sortie de 'str (ants $ Turbidity)' dans votre question? –

+0

str (fourmis $ Turbidité) num [1: 291] 0 0 -0,1 -0,2 -0,2 -0,5 0,1 -0,4 0 -0,2 ... – Joey

0

EDIT. J'oublie la conversion as.character (voir commentaire Joris).


message signifie que ants$Turbidit est un factor. Il fonctionnera quand vous

ants <- ants[as.numeric(as.character(ants$Turbidity)) > 0,] 

ou

ants <- subset(ants, as.character(as.numeric(Turbidity)) > 0) 

Mais le vrai problème est que vos données ne sont pas préparés à l'analyse. Une telle conversion devrait être faite au début. Vous devriez être prudent car il pourrait y avoir des valeurs non-numériques aussi.

+2

'comme.numeric' donnera des niveaux de facteur, pas la valeur numérique. Si vous utilisez 'as.numeric (as.character (ants $ Turbidity)), vous aurez des problèmes avec' NA'. –

+0

Merci, cela fonctionne bien, j'ai réalisé que je veux vraiment garder tout supérieur ou égal à 0,0. Quand vous dites que ce type de conversion devrait être fait au début ... au début de quoi? Désolé, je suis assez nouveau à R et pas habitué à certaines des meilleures pratiques ... merci :) – Joey

+0

@Joris chose évidente mais je l'ai manqué. THX. – Marek

3

Toujours faire summary(ants) après avoir lu dans les données, et vérifiez si vous obtenez ce que vous attendez.

Vous économisez beaucoup de problèmes. Les données numériques sont sujettes à la conversion magique en types de caractères ou de facteurs.

+0

Oh mon dieu, je ne vois plus aucune de mes colonnes de données (toutes numériques) ont été importées comme numériques. J'ai l'impression d'avoir manqué quelque chose de fondamental lors de l'importation. Comment puis-je spécifier que certaines colonnes doivent être Date, Heure ou numérique? – Joey

+0

@Spacedman: il n'y a rien de magique à la conversion. S'il est converti en caractères ou en types de facteurs, il y a un problème dans les données en premier lieu. –

+0

@Joey: la conversion est due au fait qu'il y a des caractères non numériques dans votre jeu de données. Si c'était possible, R les aurait rendus numériques. Vous devez supprimer ces caractères non numériques. –