【问题标题】:Select rows of a data frame based on a vector containing several strings根据包含多个字符串的向量选择数据框的行
【发布时间】:2021-04-06 13:02:09
【问题描述】:

我有一个词向量,我需要用它来选择数据框中的几行,其中包含超过 1000 个观察值。下面我放一个简单的。

这些是我要在数据框中寻找的食物:ls_foods <- c("Abacate", "Abacaxi", "Abóbora", "Abobrinha", "Acelga", "Acerola", "Alface", "Almeirão", "Arroz", "Banana", "Batata", "Batata doce", "Berinjela","Brocolis","Cacau", "Café")

这是df。我必须只选择包含向量ls_foods 中单词的行。其中一些包含特殊字符,而另一些则不包含。

id <- (1:5)
Variables <- c("abacate - kg", "batata inglesa - Kg", "Pera - pés", "Brocolis - Kg", "Laranja (Lima, Pêra, da Terra, etc) - Pés")
df <- data.frame(id, variables)

我试过了,但没有成功:

df <- df[grepl(ls_foods, df$desc_var)]

我期望的结果是:

id <- c(1, 2,4)
Variables <- c("abacate - kg", "batata inglesa - Kg", "Brocolis - Kg")
df_1 <- data.frame(id, variables)

提前致谢!

【问题讨论】:

  • 你的问题不是很清楚,但也许你想要est_1km[est_1km$desc_var %in% ls_alimento, ]
  • 我也试过这个。也许我可以尝试一个'''循环''',但我不太擅长。
  • 编辑后问题更清楚了。确实,我的评论方式不对。
  • 你可以试试这个,grepl(paste0(ls_foods, collapse="|"), df$desc_var)
  • 如果您没有在 [ 中为数据框添加逗号,它将默认为列。你想要行。所以试试df &lt;- df[grepl(paste0(ls_foods, collapse="|"), df$desc_var), ],它既添加了所需的逗号,又将模式与| 连接起来用于OR。

标签: r string grepl


【解决方案1】:

尝试subset + grepl 如下所示

subset(
  df,
  grepl(
    paste0(ls_foods, collapse = "|"),
    variables,
    ignore.case = TRUE
  )
)

给了

  id           variables
1  1        abacate - kg
2  2 batata inglesa - Kg
4  4       Brocolis - Kg

【讨论】:

    【解决方案2】:

    这是我的答案,检查我是否使用一行来将特殊字符转换为非特殊字符,在那里你必须指定出现的特殊字符。

    id <- (1:5)
    variables <- c("abacate - kg", "batata inglesa - Kg", "Pera - pés", 
                   "Brocolis - Kg", "Laranja (Lima, Pêra, da Terra, etc) - Pés")
    df <- data.frame(id, variables)
    
    
    ls_foods <- c("Abacate", "Abacaxi",  "Abóbora", "Abobrinha", "Acelga",  
                  "Acerola", "Alface", "Almeirão", "Arroz", "Banana", "Batata", 
                  "Batata doce", "Berinjela","Brocolis","Cacau", "Café")
    
    # Convert special characters with chartr
    answer <- unlist(sapply(chartr(old = "áéíóúàèìòù", new = "aeiouaeiou", x = tolower(ls_foods)), 
                     grep, x = tolower(variables)))
    

    【讨论】:

      【解决方案3】:

      通常在处理重音字符不被视为有意义的重音字符时,我将所有内容简化为拉丁语 ASCII。 stringi 包很方便。

      library(stringi)
      
      simplify <- function(x) stri_trans_general(x, "Latin-ASCII; Lower"))
      
      df[
        stri_detect_regex(
          simplify(df$variables),
          paste(simplify(ls_foods), collapse = "|")
        ),
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-21
        • 2019-12-29
        • 2016-08-07
        • 2016-06-21
        相关资源
        最近更新 更多