У меня есть набор данных с пустыми строками. Я бы хотел их удалить:
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 строками.
Что я сделал не так? Мне это кажется бессмысленным.
Ответы:
Я предполагаю, что вы хотите удалить строки, которые все являются НА. Затем вы можете сделать следующее:
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
источник
data[complete.cases(data),]
.,
в концеdata[complete.cases(data),]
вашего кода?Если у вас есть пустые строки, а не NA, вы можете:
data[!apply(data == "", 1, all),]
Чтобы удалить оба (НП и пустой):
data <- data[!apply(is.na(data) | data == "", 1, all),]
источник
Вот несколько
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
источник
Альтернативное решение для строк
NA
с использованиемjanitor
пакетаmyData %>% remove_empty("rows")
источник
Это похоже на некоторые из приведенных выше ответов, но с этим вы можете указать, хотите ли вы удалить строки с процентом отсутствующих значений, большим или равным заданному проценту (с аргументом
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
источник