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:
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
quelle
data[complete.cases(data),]
.,
am Endedata[complete.cases(data),]
deines Codes ein?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),]
quelle
Hier sind einige
dplyr
Optionen:# 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
quelle
Alternative Lösung für Reihen von
NA
s mitjanitor
PaketmyData %>% remove_empty("rows")
quelle
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
x
ist ein Datenrahmen undpct
ist der Schwellenwert fürNA
gefüllte Daten, die Sie entfernen möchten.pct = 1
bedeutet, Zeilen zu entfernen, die 100% ihrer Werte habenNA
.pct = .5
bedeutet Remome-Zeilen, die mindestens die Hälfte ihrer Werte habenNA
quelle