web-dev-qa-db-fra.com

Supprimer les colonnes de la trame de données dont certaines valeurs sont NA

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?

23
TTT

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)))]
45
Sven Hohenstein

Voici un moyen pratique de le faire en utilisant la fonction dplyrselect_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(.)))
21
Matt Dancho

Vous pouvez utiliser la transposition deux fois:

newdf <- t(na.omit(t(df)))
10
Scott Worland
data[,!apply(is.na(data), 2, any)]
6
Backlin

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()).

1
lmo

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))]
1
Oriol Prat