2016-04-15 3 views
3

У меня есть кадр данных, содержащий несколько векторов, содержащих строки, которые я хотел бы удалить, строки, содержащие определенную строку.Удалить строки, содержащие строку в любом векторе в кадре данных

df <- data.frame(id=seq(1:10), 
      foo=runif(10), 
      sapply(letters[1:5],function(x) {sample(letters,10,T)}), 
      bar=runif(10)) 

Это может быть сделано на одном векторе, указав имя вектора, т.е.

df <- df[!grepl("b", df$a),] 

, который можно затем повторить указания каждого вектора, например,

df <- df[!grepl("b", df$b),] 
df <- df[!grepl("b", df$c),] 
df <- df[!grepl("b", df$d),] 
df <- df[!grepl("b", df$e),] 

, но возможно ли это сделать в одной строке без указания каких столбцов содержать строку? Что-то вроде:

df <- df[!grepl("b", df),] 

ответ

5

Вы можете попробовать

df[-which(df=="b", arr.ind=TRUE)[,1],] 

или, как это было предложено @docendodiscimus

df[rowSums(df == "b") == 0,] 

Этот второй вариант предпочтительнее, поскольку он не приводит к какой-либо сложности, если нет соответствия шаблон найден.

+2

Я нашел отрицая индексирует немного опасный подход, так как он будет возвращает пустой data.frame, если совпадений нет. Например, 'df [-which (df ==" ab ", arr.ind = TRUE) [, 1],]'. Вот почему я предпочитаю «grepl' над« grep » –

+0

Согласен. Ваше предложение лучше. – RHertel

+2

Пожалуйста, не стесняйтесь добавить его к ответу –

1
target_cols <- c("a", "b", "c", "d", "e") 
df[!Reduce(`|`, lapply(df[,target_cols], function(col) grepl("b", col))),] 
+0

спасибо - но опять же, как в моем комментарии выше - в идеале мне не нужно будет указывать, какие столбцы содержат строку, так как на практике может быть много –

+1

Я хотел чтобы показать более гибкое решение, но без указания столбцов было бы еще проще 'df [! Reduce (' | ', lapply (df, function (col) grepl (" b ", col)),]' должны быть обратные обратные вокруг '|' как в ответ, но в комментариях они исчезают – inscaven

3

Вставить столбцы затем grepl:

df[!grepl("b", paste0(df$a, df$b, df$c, df$d, df$e)), ] 

Определить фактор (или столбцы символов), а затем вставить:

df[!grepl("b", 
      apply(df[, sapply(df, class) == "factor"], 1, paste0, collapse = ",")), ] 
+0

спасибо за ваш ответ - но в идеале мне не нужно будет указывать столбцы где угодно, так как на практике у меня может быть очень много –