web-dev-qa-db-fra.com

Recherche de données non numériques dans un cadre ou un vecteur de données R

J'ai lu des données volumineuses avec read.csv () et, à ma grande surprise, les données apparaissent sous forme de facteurs plutôt que de chiffres. Je suppose donc qu'il doit y avoir au moins un élément non numérique dans les données. Comment puis-je trouver où se trouvent ces articles?

Par exemple, si j'ai le cadre de données suivant:

df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))

J'aimerais savoir que les lignes 5 et 9 contiennent des données non numériques. Comment je ferais ça?

15
df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))

L'astuce consiste à savoir que la conversion en numérique via as.numeric(as.character(.)) convertira les non-nombres en NA.

which(is.na(as.numeric(as.character(df[[1]]))))
## 5 9

(utiliser simplement as.numeric(df[[1]]) ne fonctionne pas - cela supprime simplement les niveaux en laissant les codes numériques).

Vous pouvez choisir de supprimer les avertissements:

which.nonnum <- function(x) {
   which(is.na(suppressWarnings(as.numeric(as.character(x)))))
}
which.nonnum(df[[1]])

Pour faire plus attention, vous devriez également vérifier que les valeurs n'étaient pas NA avant la conversion:

which.nonnum <- function(x) {
   badNum <- is.na(suppressWarnings(as.numeric(as.character(x))))
   which(badNum & !is.na(x))
}
21
Ben Bolker

Une alternative pourrait être de vérifier quelles entrées du vecteur contiennent des caractères autres qu'un nombre:

df <- data.frame(c(1,2,3,4,"five",6,7,8,"nine",10))
which(!grepl('^[0-9]',df[[1]]))
## 5 9 
1
Florian