Двойная петля для фильтрации данных с помощью grepl - PullRequest
0 голосов
/ 01 марта 2019

У меня есть один вопрос;Я хотел бы отфильтровать каждый из столбцов Pair_1 до Pair_4 во фрейме данных «data01» для каждого из шаблонов символов, перечисленных в «pexl07».

Фрейм данных data01 выглядит следующим образом:

               Pair_1                     Pair_2                     Pair_3                   Pair_4
453  lupinespringcereal       grasscloverleyquinoa   springcerealspringcereal         camelinacamelina
1073 lupinespringcereal     grasscloverleycamelina   springcerealspringcereal             quinoaquinoa
1330 lupinespringcereal     grasscloverleycamelina         quinoaspringcereal             lupinequinoa
1373 lupinespringcereal     grasscloverleycamelina               quinoaquinoa       lupinespringcereal
1698     lupinecamelina grasscloverleyspringcereal               quinoaquinoa springcerealspringcereal
1910 lupinespringcereal       springcerealcamelina grasscloverleyspringcereal             lupinequinoa
1947 lupinespringcereal       springcerealcamelina       grasscloverleyquinoa       lupinespringcereal
1979 lupinespringcereal         springcerealquinoa grasscloverleyspringcereal           lupinecamelina
2141       lupinequinoa   springcerealspringcereal     grasscloverleycamelina       lupinespringcereal
2745     lupinecamelina   springcerealspringcereal       grasscloverleyquinoa springcerealspringcereal

Pexl07 выглядит следующим образом (для примера):

                       V1
1             quinoaquinoa
2 springcerealspringcereal

Я пробовал много разных вещей,используя for (), filter (), subset (), grepl.sub () и grepl (), но мне не удается заставить его работать, вероятно, потому что я не понимаю индексацию с помощью циклов.Также приветствуются параметры без циклов.

Этот фрагмент работает с одним столбцом и одним шаблоном:

data02 <- filter(data01, !grepl(paste(pexl07[1 , 1]), paste(data01[ ,1 ])) 

Однако как мне сделать так, чтобы он работал автоматически, для всех выражений в pexl07 ина всех столбцах data01?

Я попробовал несколько вариантов этого, но он не возвращает то, что я хотел бы:

for (j in ncol(data01))  {
  for (i in 1:nrow(pexl07)) {
    data02 <- filter(data01,
                         !grepl(paste(pexl07[j, ]), paste(data01[ ,i]))) 
  } 
} 

Чтобы было ясно, я хочу, чтобы это закончилоськак это:

                 Pair_1                 Pair_2                     Pair_3             Pair_4
1330 lupinespringcereal grasscloverleycamelina         quinoaspringcereal       lupinequinoa
1910 lupinespringcereal   springcerealcamelina grasscloverleyspringcereal       lupinequinoa
1947 lupinespringcereal   springcerealcamelina       grasscloverleyquinoa lupinespringcereal
1979 lupinespringcereal     springcerealquinoa grasscloverleyspringcereal     lupinecamelina

с dput:

structure(list(Pair_1 = structure(c(6L, 6L, 6L, 6L), .Label = c("grasscloverleycamelina", 
"grasscloverleyquinoa", "lupinecamelina", "lupinegrasscloverley", 
"lupinequinoa", "lupinespringcereal"), class = "factor"), Pair_2 = structure(c(3L, 
9L, 9L, 11L), .Label = c("camelinacamelina", "camelinagrasscloverley", 
"grasscloverleycamelina", "grasscloverleyquinoa", "grasscloverleyspringcereal", 
"quinoagrasscloverley", "quinoaquinoa", "quinoaspringcereal", 
"springcerealcamelina", "springcerealgrasscloverley", "springcerealquinoa", 
"springcerealspringcereal"), class = "factor"), Pair_3 = structure(c(11L, 
7L, 6L, 7L), .Label = c("camelinacamelina", "camelinagrasscloverley", 
"camelinaquinoa", "camelinaspringcereal", "grasscloverleycamelina", 
"grasscloverleyquinoa", "grasscloverleyspringcereal", "quinoacamelina", 
"quinoagrasscloverley", "quinoaquinoa", "quinoaspringcereal", 
"springcerealcamelina", "springcerealquinoa", "springcerealspringcereal"
), class = "factor"), Pair_4 = structure(c(6L, 6L, 7L, 5L), .Label = c("camelinacamelina", 
"camelinagrasscloverley", "grasscloverleycamelina", "grasscloverleyspringcereal", 
"lupinecamelina", "lupinequinoa", "lupinespringcereal", "quinoagrasscloverley", 
"quinoaquinoa", "quinoaspringcereal", "springcerealcamelina", 
"springcerealquinoa", "springcerealspringcereal"), class = "factor")), row.names = c(1330L, 
1910L, 1947L, 1979L), class = "data.frame")

dput pexl07:

structure(list(V1 = structure(1:2, .Label = c("quinoaquinoa", 
"springcerealspringcereal"), class = "factor")), row.names = 1:2, class = "data.frame")

dput data01:

  structure(list(Pair_1 = structure(c(6L, 6L, 6L, 6L, 3L, 6L), .Label = c("grasscloverleycamelina", 
    "grasscloverleyquinoa", "lupinecamelina", "lupinegrasscloverley", 
    "lupinequinoa", "lupinespringcereal"), class = "factor"), Pair_2 = structure(c(4L, 
    3L, 3L, 3L, 5L, 9L), .Label = c("camelinacamelina", "camelinagrasscloverley", 
    "grasscloverleycamelina", "grasscloverleyquinoa", "grasscloverleyspringcereal", 
    "quinoagrasscloverley", "quinoaquinoa", "quinoaspringcereal", 
    "springcerealcamelina", "springcerealgrasscloverley", "springcerealquinoa", 
    "springcerealspringcereal"), class = "factor"), Pair_3 = structure(c(14L, 
    14L, 11L, 10L, 10L, 7L), .Label = c("camelinacamelina", "camelinagrasscloverley", 
    "camelinaquinoa", "camelinaspringcereal", "grasscloverleycamelina", 
    "grasscloverleyquinoa", "grasscloverleyspringcereal", "quinoacamelina", 
    "quinoagrasscloverley", "quinoaquinoa", "quinoaspringcereal", 
    "springcerealcamelina", "springcerealquinoa", "springcerealspringcereal"
    ), class = "factor"), Pair_4 = structure(c(1L, 9L, 6L, 7L, 13L, 
    6L), .Label = c("camelinacamelina", "camelinagrasscloverley", 
    "grasscloverleycamelina", "grasscloverleyspringcereal", "lupinecamelina", 
    "lupinequinoa", "lupinespringcereal", "quinoagrasscloverley", 
    "quinoaquinoa", "quinoaspringcereal", "springcerealcamelina", 
    "springcerealquinoa", "springcerealspringcereal"), class = "factor")), row.names = c(453L, 
    1073L, 1330L, 1373L, 1698L, 1910L), class = "data.frame")

1 Ответ

0 голосов
/ 01 марта 2019

Обновлено мой ответ. Если я вас правильно понял, вы хотите удалить наблюдение.В R это обозначается отсутствующим значением, равным NA.Вместо того, чтобы хранить то, что вы хотите удалить в кадре данных, храните в векторе, проще использовать таким образом в фильтре.

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

Я использую Tidyverse, чтобы добиться того, что вы хотите.код ниже

#convert pexl07 to a vector
pexl07 <-pexl07$V1
library(tidyr)
data01 %>%
gather(pair,cereal) %>%
group_by(pair) %>%
mutate(index = row_number()) %>%
mutate(cereal = ifelse(cereal %in% pexl07,NA,cereal)) %>%
spread(pair,cereal)

Вы на самом деле не фильтруете, а фильтруете, заменяя символы пробелами.Поэтому я заменяю столбцы в вашем фрейме данных на "" (пусто), где оно равно условию, что одно из выражений в pexl07.Для этого используйте gsub и regularexpressions (regex).читать на ?gsub.Я использую sapply, это будет применяться к каждому столбцу

sapply (data01, function (col) gsub ("quinoaquinoa | springcerealspringcereal", "", col))

и если вы используете dplyr, . обозначает столбец.mutate_all будет мутировать все столбцы.

#dplyr version data01%>% mutate_all (funs (gsub ("quinoaquinoa | springcerealspringcereal", "" ,.)))
...