Question

J'ai un fichier CSV de données que je peux charger dans R avec read.csv ()

Certaines données sont manquantes. Je souhaite donc réduire le cadre de données pour qu'il ne soit composé que de données non manquantes, c'est-à-dire si un NULL apparaît n'importe où, je souhaite exclure cette colonne. et une ligne de l'ensemble de données filtrées.

Je sais que je peux probablement le faire assez simplement avec les opérations de vecteur R incorporées, mais je ne sais pas trop comment procéder.

Pour rendre ma question un peu plus concrète, voici un échantillon rapide des données afin que vous puissiez voir ce que je veux faire.

DocID       Anno1    Anno7  Anno8
1           7        NULL   8
2           8        NULL   3
44          10       2      3
45          6        6      6
46          1        3      4
49          3        8      5
62          4        NULL   9
63          2        NULL   4
67          11       NULL   3
91          NULL     9      7
92          NULL     7      5
93          NULL     8      8

Donc, étant donné cette entrée, il me faut un code qui réduira la sortie à ceci.

DocID       Anno8
44          3
45          6
46          4
49          5

As Anno8 est la seule colonne contenant des données non NULL. Seules quatre lignes contiennent des données non NULL.

Était-ce utile?

La solution

Si x est votre nom de données.fr (ou matrice ), alors

x[ ,apply(x, 2, function(z) !any(is.na(z)))]

Étant donné que votre exemple utilise NULL , is.na (& # 183;) sera remplacé par is.null (& # 183;)

Vous pouvez également consulter sous-ensemble (& # 183;) .

Autres conseils

Vous pouvez supprimer n'importe quelle ligne contenant un élément manquant à l'aide de na.omit (), mais ce n'est pas ce que vous voulez. De plus, la réponse actuellement acceptée est fausse. Il vous donne des colonnes complètes, mais ne supprime pas les lignes qui ont une ou plusieurs valeurs manquantes, ce qui a été demandé. La bonne réponse peut être obtenue comme suit:

> a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4))
> a
  a  b c
1 1 NA 3
2 2  1 4
> na.omit(a)[,colSums(is.na(a))==0]
  a c
2 2 4

Pour voir que la réponse ci-dessus est fausse:

> a[ ,apply(a, 2, function(z) !any(is.na(z)))]
  a c
1 1 3
2 2 4

La ligne 1 doit être supprimée à cause de la NA dans la colonne 2.

a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1))

na.omit(a)
  a b c
2 2 1 4
4 1 1 1

a[rowSums(is.na(a))==0,]
  a b c
2 2 1 4
4 1 1 1

a[complete.cases(a),]
  a b c
2 2 1 4
4 1 1 1

Vous pouvez également le faire en utilisant la bibliothèque sqldf , si x est votre cadre de données:

library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
                 WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top