【问题标题】:Double for-loop filtering data frame with grepl使用 grepl 进行双 for 循环过滤数据帧
【发布时间】:2019-03-01 20:01:26
【问题描述】:

我有一个问题;我想在“pexl07”中列出的每个字符模式上过滤数据框“data01”中的每一列 Pair_1 直到 Pair_4。

数据框 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

带输入:

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")

输入 pexl07:

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

输入数据01:

  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")

【问题讨论】:

    标签: r for-loop filter grepl


    【解决方案1】:

    更新了我的答案 如果我现在正确理解你,你想删除观察。 在 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 和正则表达式 (regex) 来执行此操作。 阅读?gsub。 我正在使用 sapply,这将适用于每一列

    sapply(data01,函数(col) gsub("藜麦|springcerealspringcereal","",col))

    如果您使用的是 dplyr,. 表示该列。 mutate_all 将改变所有列。

    #dplyr 版本 数据01 %>% mutate_all(funs(gsub("藜麦|springcerealspringcereal","",.)))

    【讨论】:

    • 谢谢!我不认为我想用空白替换,我想删除整行/观察。此外,pexl07 中的行数和内容可能会有所不同,所以我不想每次都输入它。如何轻松地将 pexl07 中的所有内容添加到 gsub 函数中?
    • 是的,我想删除整行,而不是替换为 NA。这在上面我想要的输出中可见,在这种情况下,这意味着在过滤掉包含这些模式的所有观察后剩下 4 个观察。
    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2017-10-04
    • 2013-02-24
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多