Удалить строку, если какой-либо столбец содержит определенную строку

Я пытаюсь найти лучший подход в R, чтобы удалить строки, содержащие определенную строку, в моем случае "no_data".

У меня есть данные из внешнего источника, который вменяет na с 'no_data'

Вот пример:

 time  |speed  |wheels
1:00   |30     |no_data
2:00   |no_data|18
no_data|no_data|no_data
3:00   |50     |18

Я хочу просмотреть данные и удалить каждую строку, содержащую эту строку "no_data" в любом столбце. У меня было много проблем с этим. Я пробовал использовать sapply, filter, grep и комбинации из трех. Я ни в коем случае не эксперт r, так что это может быть просто неправильно использовать их. Любая помощь будет оценена.

Ответ 1

Мы можем использовать rowSums для создания логического vector и подмножества на его основе

df1[rowSums(df1 == "no_data")==0, , drop = FALSE]
#   time speed wheels
#4 3:00    50     18

данные

df1 <- structure(list(time = c("1:00", "2:00", "no_data", "3:00"), speed = c("30", 
"no_data", "no_data", "50"), wheels = c("no_data", "18", "no_data", 
"18")), .Names = c("time", "speed", "wheels"), class = "data.frame", 
row.names = c(NA, -4L))

Ответ 2

Вы можете прочитать данные с помощью na.strings = 'no_data', чтобы установить их как NA, а затем просто опустить NA (или взять complete.cases), т.е. (с использованием набора данных @akrun)

d1 <- read.table(text = 'time   speed  wheels
 1    1:00      30 no_data
            2    2:00 no_data      18
            3 no_data no_data no_data
            4    3:00      50      18', na.strings = 'no_data', h=TRUE)

d1[complete.cases(d1),]
#  time speed wheels
#4 3:00    50     18

#OR

na.omit(d1)
#  time speed wheels
#4 3:00    50     18

Ответ 3

Опция : (используя данные @Akrun)

require(dplyr)
df1 %>% filter_all(all_vars(!grepl('no_data',.)))

 time speed wheels
1 3:00    50     18

Предостережение:
Это работает, только если вы хотите удалить все строки с этой строкой. Если вы хотите получить все строки с этой строкой, all_vars(grepl('no_data',.) (Без !) Будет недостаточно: это позволит получить только те строки, в которых все столбцы содержат строку. В этом случае используйте filter_all(any_vars()) вместо этого.

Ответ 4

Ответ akrun - быстрый, правильный и простой, насколько это возможно:) однако, если вы хотите сделать вашу жизнь более сложной, вы также можете сделать:

dat
     time   speed  wheels
1    1:00      30 no_data
2    2:00 no_data      18
3 no_data no_data no_data
4    3:00      50      18

dat$new <- apply(dat[,1:3], 1, function(x) any(x %in% c("no_data")))
dat <- dat[!(dat$new==TRUE),]
dat$new <- NULL

dat
  time speed wheels
4 3:00    50     18