Как отфильтровать строки, содержащие строку в любом столбце в кадре данных - PullRequest
1 голос
/ 08 июля 2019

Используя mtcars фрейм данных, как я могу получить новый фрейм данных, содержащий строку "3"

Пока у меня есть:

mtcars<-lapply(mtcars, function(x) as.character(x))
myindices<-sapply(mtcars, function(x) { grep("3",x, ignore.case = TRUE) })

Это дает мне списокиндексы.Как мне получить отфильтрованный кадр данных из оригинала.

Не стесняйтесь критиковать мой подход, это конечный результат, который меня действительно интересует

Ответы [ 5 ]

3 голосов
/ 08 июля 2019

Аналогично вашему sapply решению:

mtcars[sapply(1:nrow(mtcars), function(i) any(grepl("3", mtcars[i,], fixed = T))),]

Или вы также можете сделать это:

mtcars[grepl("3", do.call(paste0, mtcars), fixed = T),]
3 голосов
/ 08 июля 2019

Мы можем использовать grepl с Reduce с base R

out <- mtcars[Reduce(`|`, lapply(mtcars, grepl, pattern = "3")),]
dim(out)
#[1] 31 11
3 голосов
/ 08 июля 2019

Мы можем использовать filter_all от dplyr. Возвращает фрейм данных со строками, в котором есть хотя бы один столбец, содержащий строку «3»:

library(dplyr)

mtcars %>%
  filter_all(any_vars(grepl("3", .)))

Если нам нужен кадр данных со строками, в котором есть все столбцы, содержащие строку «3». Мы используем all_vars вместо any_vars:

mtcars %>%
  filter_all(all_vars(grepl("3", .)))
0 голосов
/ 08 июля 2019

Мы можем использовать toString.

mtcars.3 <- mtcars[grep("3", apply(mtcars, 1, toString)), ]

Проверка:

rbind(mtcars=dim(mtcars), mtcars.3=dim(mtcars.3))
         [,1] [,2]
mtcars     32   11
mtcars.3   31   11
0 голосов
/ 08 июля 2019

Другое базовое решение R:

mtcars[apply(mtcars,1,function(x) grepl("3",paste(x,collapse=""))),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...