Leere Zeilen einer Datendatei in R entfernen

79

Ich habe einen Datensatz mit leeren Zeilen. Ich möchte sie entfernen:

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

Es funktioniert OK. Aber jetzt möchte ich eine Spalte in meine Daten einfügen und den ersten Wert initialisieren:

myData$newCol[1] <- -999

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

Leider funktioniert es nicht und ich verstehe nicht wirklich warum und ich kann das nicht lösen. Es funktionierte, als ich jeweils eine Zeile mit folgenden Elementen entfernte:

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

Oder ähnliches.

Es funktioniert auch, wenn ich nur die ersten 13.000 Zeilen verwendet habe.

Aber es funktioniert nicht mit meinen tatsächlichen Daten, mit 32.000 Zeilen.

Was habe ich falsch gemacht? Es scheint mir keinen Sinn zu machen.

Antonin
quelle
Mögliches Duplikat von Zeilen mit NAs in data.frame entfernen
Waldir Leoncio

Antworten:

104

Ich gehe davon aus, dass Sie Zeilen entfernen möchten, die alle NAs sind. Dann können Sie Folgendes tun:

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

Wenn Sie Zeilen mit mindestens einer NA entfernen möchten, ändern Sie einfach die Bedingung:

data[rowSums(is.na(data)) == 0,]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    6    7
Wookai
quelle
32
Der zweite Fall kann auch behandelt werden über : data[complete.cases(data),].
Joshua Ulrich
@JoshuaUlrich Danke für deine helfende Antwort! Nur zum Verständnis? Warum lässt du ,am Ende data[complete.cases(data),]deines Codes ein?
Anna.Klee
1
@mrquad, das heißt, Sie werden nach Zeilen unterteilt. Siehe stackoverflow.com/a/17052459/2152245 .
Matt
54

Wenn Sie leere Zeilen und keine NAs haben, können Sie Folgendes tun:

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

So entfernen Sie beide (NAs und leer):

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

Hier sind einige dplyrOptionen:

# 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
sbha
quelle
1
Weder na.omit () noch drop_na () geben Nicht-NA-Zeilen zurück.
7

Alternative Lösung für Reihen von NAs mit janitorPaket

myData %>% remove_empty("rows")
Radek
quelle
1
Dies war die einfachste Lösung und es hat bei mir funktioniert - danke!
2

Dies ähnelt einigen der obigen Antworten, aber mit dieser Option können Sie angeben, ob Sie Zeilen mit einem Prozentsatz fehlender Werte entfernen möchten, der größer oder gleich einem bestimmten Prozentsatz ist (mit dem Argument pct).

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

Wo xist ein Datenrahmen und pctist der Schwellenwert für NAgefüllte Daten, die Sie entfernen möchten.

pct = 1bedeutet, Zeilen zu entfernen, die 100% ihrer Werte haben NA. pct = .5bedeutet Remome-Zeilen, die mindestens die Hälfte ihrer Werte habenNA

Samantha Karlaina Rhoads
quelle
Wie benutzt man diesen SPASS auf df?
Kshitij Manvelikar