J'ai une trame de données où certaines des valeurs sont NA. Je voudrais supprimer ces colonnes.
Mon data.frame ressemble à ceci
v1 v2
1 1 NA
2 1 1
3 2 2
4 1 1
5 2 2
6 1 NA
J'ai essayé d'estimer la moyenne des cols et de sélectionner les moyennes des colonnes! = NA. J'ai essayé cette déclaration, cela ne fonctionne pas.
data=subset(Itun, select=c(is.na(colMeans(Itun))))
J'ai une erreur,
erreur: 'x' doit être un tableau d'au moins deux dimensions
Est-ce que quelqu'un peut m'aider?
Les données:
Itun <- data.frame(v1 = c(1,1,2,1,2,1), v2 = c(NA, 1, 2, 1, 2, NA))
Cela supprimera toutes les colonnes contenant au moins un NA
:
Itun[ , colSums(is.na(Itun)) == 0]
Une autre méthode consiste à utiliser apply
:
Itun[ , apply(Itun, 2, function(x) !any(is.na(x)))]
Voici un moyen pratique de le faire en utilisant la fonction dplyr
select_if()
. Ne combinez pas (!
), any()
et is.na()
, ce qui revient à sélectionner toutes les colonnes qui ne contiennent aucune valeur NA.
library(dplyr)
Itun %>%
select_if(~ !any(is.na(.)))
Vous pouvez utiliser la transposition deux fois:
newdf <- t(na.omit(t(df)))
data[,!apply(is.na(data), 2, any)]
Une méthode de base R liée aux réponses apply
est
Itun[!unlist(vapply(Itun, anyNA, logical(1)))]
v1
1 1
2 1
3 2
4 1
5 2
6 1
Ici, vapply
est utilisé car nous fonctionnons sur une liste, et, apply
, il ne contraint pas l'objet dans une matrice. De plus, comme nous savons que la sortie sera un vecteur logique de longueur 1, nous pouvons le fournir à vapply
et potentiellement obtenir un petit coup de pouce de vitesse. Pour la même raison, j'ai utilisé anyNA
au lieu de any(is.na())
.
Une autre alternative avec le package dplyr
serait d'utiliser la fonction Filter
Filter(function(x) !any(is.na(x)), Itun)
avec data.table
serait un peu plus encombrant
setDT(Itun)[,.SD,.SDcols=setdiff((1:ncol(Itun)),
which(colSums(is.na(Itun))>0))]