web-dev-qa-db-fra.com

Supprimer les lignes vides d'un fichier de données dans R

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

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 ceci .

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

Ou quelque chose de similaire.

Cela fonctionne également lorsque je n'ai utilisé que 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 n'avoir aucun sens pour moi.

63
Antonin

Je suppose que vous voulez supprimer les lignes qui sont toutes des 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)) # sample data
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 souhaitez supprimer les lignes comportant au moins un NA, modifiez simplement la condition:

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

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

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

Pour supprimer les deux (NA et vide):

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

Voici quelques options dplyr:

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

library(dplyr)

# remove rows where all values are NA:
df %>% filter_all(any_vars(!is.na(.)))
df %>% filter_all(any_vars(complete.cases(.)))  


# remove rows where only some values are NA:
df %>% filter_all(all_vars(!is.na(.)))
df %>% filter_all(all_vars(complete.cases(.)))  

# or more succinctly:
df %>% filter(complete.cases(.))  
df %>% na.omit

# dplyr and tidyr:
library(tidyr)
df %>% drop_na
3
sbha

Solution alternative pour les lignes de NAs utilisant janitor package 

myData %>% remove_empty("rows")
0
radek

Ceci est similaire à certaines des réponses ci-dessus, mais avec cela, vous pouvez spécifier si vous souhaitez supprimer les lignes avec un pourcentage de valeurs manquantes supérieur ou égal à un pourcentage donné (avec l'argument pct)

drop_rows_all_na <- function(x, pct=1) x[!rowSums(is.na(x)) >= ncol(x)*pct,]

x est une image et pct est le seuil de NA- données remplies dont vous souhaitez vous débarrasser.

pct = 1 signifie supprimer les lignes ayant 100% de ses valeurs NA.pct = .5 signifie que quelques lignes ont au moins la moitié de ses valeurs NA

0