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.


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

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),]

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

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")

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


Wie benutzt man diesen SPASS auf df?
Kshitij Manvelikar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.