Видалення порожніх рядків файлу даних у R


82

У мене є набір даних з порожніми рядками. Я хотів би їх видалити:

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

Це працює нормально. Але тепер я хотів би додати стовпець у свої дані та ініціалізувати перше значення:

myData$newCol[1] <- -999

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

На жаль, це не працює, і я насправді не розумію, чому, і я не можу це вирішити. Це спрацювало, коли я видаляв по одному рядку за допомогою:

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

Або щось подібне.

Це також працює, коли я використовував лише перші 13 000 рядків.

Але це не працює з моїми фактичними даними, з 32 000 рядків.

Що я зробив неправильно? Здається, для мене це не має сенсу.


Відповіді:


106

Я припускаю, що ви хочете видалити рядки, які є всі NA. Тоді ви можете зробити наступне:

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

Якщо ви хочете видалити рядки, які містять принаймні один NA, просто змініть умову:

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

34
У другому випадку також може бути оброблений з допомогою: data[complete.cases(data),].
Джошуа Ульріх

@JoshuaUlrich Thx за допомогу! Тільки для розуміння? Чому ви вводите a ,в кінці data[complete.cases(data),]коду?
Anna.Klee

1
@mrquad, це означає, що ви підмножуєте рядки; див. stackoverflow.com/a/17052459/2152245 .
Метт

56

Якщо у вас є порожні рядки, а не NA, ви можете зробити:

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

Щоб видалити обидва (НС та порожні):

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

12

Ось кілька 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

1
Ні na.omit (), ні drop_na () не повертають рядків, що не є NA.

8

Альтернативне рішення для рядків NAs, що використовують janitorпакет

myData %>% remove_empty("rows")

1
Це було найпростіше рішення, і воно спрацювало для мене - дякую!

2

Це схоже на деякі з наведених вище відповідей, але за допомогою цього ви можете вказати, чи хочете ви видалити рядки із відсотком відсутніх значень, більшим або рівним заданому відсотку (з аргументом pct)

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

Де xзнаходиться фрейм даних і pctє порогом NAзаповнених даних, від яких потрібно позбутися.

pct = 1означає видалити рядки, які мають 100% його значень NA. pct = .5означає перероблені рядки, які мають принаймні половину його значеньNA


Як використовувати цю ЗАБАВЛЕННЯ на df?
Kshitij Manvelikar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.