101 votes

Suppression des lignes vides d'un fichier de données en R

J'ai un ensemble de données avec des lignes vides. Je voudrais les supprimer :

myData<-myData[-which(apply(myData,1,function(x)all(is.na(x)))),]

Cela fonctionne bien. Mais maintenant, je voudrais ajouter une colonne dans mes données et initialiser la première valeur :

myData$newCol[1] <- -999

Error in `$<-.data.frame`(`*tmp*`, "newCol", value = -999) : 
  replacement has 1 rows, data has 0

Malheureusement, cela ne fonctionne pas et je ne comprends pas vraiment pourquoi et je ne peux pas résoudre cela. Cela a fonctionné lorsque j'ai supprimé une ligne à la fois en utilisant :

TgData = TgData[2:nrow(TgData),]

Ou quelque chose de similaire.

Cela fonctionne également lorsque j'ai utilisé seulement les 13.000 premières lignes.

Mais cela ne fonctionne pas avec mes données réelles, avec 32.000 lignes.

Qu'ai-je fait de mal ? Cela semble ne pas avoir de sens pour moi.

130voto

Wookai Points 8647

Je suppose que vous souhaitez supprimer les lignes qui sont toutes NA. Ensuite, vous pouvez faire ce qui suit :

data <- rbind(c(1,2,3), c(1, NA, 4), c(4,6,7), c(NA, NA, NA), c(4, 8, NA)) # données d'exemple
data
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]   NA   NA   NA
[5,]    4    8   NA

data[rowSums(is.na(data)) != ncol(data),]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]    4    8   NA

Si vous voulez supprimer les lignes qui ont au moins un NA, changez simplement la condition :

data[rowSums(is.na(data)) == 0,]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    6    7

75voto

Alex Nevsky Points 837

Si vous avez des lignes vides, pas de NA, vous pouvez faire :

data[!apply(data == "", 1, all),]

Pour supprimer à la fois (NA et vide) :

data <- data[!apply(is.na(data) | data == "", 1, all),]

24voto

sbha Points 1948

Voici quelques options dplyr :

# données d'exemple
df <- data.frame(a = c('1', NA, '3', NA), b = c('a', 'b', 'c', NA), c = c('e', 'f', 'g', NA))

library(dplyr)

# supprimer les lignes où toutes les valeurs sont NA :
df %>% filter_all(any_vars(!is.na(.)))
df %>% filter_all(any_vars(complete.cases(.)))  

# supprimer les lignes où seules certaines valeurs sont NA :
df %>% filter_all(all_vars(!is.na(.)))
df %>% filter_all(all_vars(complete.cases(.)))  

# ou plus simplement :
df %>% filter(complete.cases(.))  
df %>% na.omit

# dplyr et tidyr :
library(tidyr)
df %>% drop_na

20voto

radek Points 1653

Solution alternative pour les lignes de NA en utilisant le paquet janitor

myData %>% remove_empty("rows")

3voto

Ronak Shah Points 24715

Utilisation de dplyr's if_all/if_any

Supprimer les lignes avec un NA OU Sélectionner les lignes sans valeur NA.

df %>% filter(!if_any(a:c, is.na))

#  a b c
#1 1 a e
#2 3 c g

#Aussi
df %>% filter(if_all(a:c, Negate(is.na)))

Supprimer les lignes avec toutes les valeurs NA ou sélectionner les lignes avec au moins une valeur non-NA.

df %>% filter(!if_all(a:c, is.na))

#     a b c
#1    1 a e
#2  b f
#3    3 c g

#Aussi
df %>% filter(if_any(a:c, Negate(is.na)))

data

Utilisation des données de @sbha -

df <- data.frame(a = c('1', NA, '3', NA), 
                 b = c('a', 'b', 'c', NA), 
                 c = c('e', 'f', 'g', NA))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X