Удаление пустых строк файла данных в 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

Я предполагаю, что вы хотите удалить строки, которые все являются НА. Затем вы можете сделать следующее:

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 Спасибо за полезный ответ! Просто для понимания? Почему вы допускаете 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

Альтернативное решение для строк NAс использованием 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означает remome строки, которые имеют не менее половины его значенийNA


Как использовать это FUN на df?
Кшитий Манвеликар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.