2009-01-24 8 views
10

j'ai un fichier CSV de fichier de données que je peux charger dans R en utilisant read.csv()Filtrage des données dans R

Certaines des données manque, donc je veux réduire la trame de données vers le bas pour définir qui est entièrement non -missing data, c'est-à-dire si un NULL apparaît n'importe où, je veux exclure cette colonne et cette ligne de l'ensemble de données filtré.

Je sais que je peux probablement le faire assez simplement avec les opérations de vecteur R intégré, mais je ne suis pas sûr de savoir comment faire exactement cela?

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, j'ai besoin d'un code qui va réduire la sortie à cela.

DocID  Anno8 
44   3 
45   6 
46   4 
49   5 

Comme Anno8 est la seule colonne avec des données non NULL, et il n'y a que quatre lignes avec des données non NULL.

Répondre

7

Si x est votre data.frame (ou matrix), puis

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

Étant donné que votre exemple utilise NULL, is.na(·) sera remplacé par is.null(·)

Sinon, vous pouvez regarder subset(·).

+0

Merci @rguha, c'est utile. Comment cela fonctionnerait-il si je voulais me débarrasser, dans une colonne spécifique du CSV, d'une valeur inférieure à, disons, 5? – Rodolphe

19

Vous pouvez supprimer n'importe quelle ligne contenant un fichier 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 est demandé. La réponse correcte peut être obtenue comme:

> 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 erroné:

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

Ligne 1 devrait être abandonnée en raison de la NA dans la colonne 2.

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 
+3

Je ne comprends pas cette réponse. Cela retournera toujours une seule ligne –

+1

Fixe maintenant, merci –