首页 文章

删除包含非英文字符的文本

提问于
浏览
5

这是我的示例数据集:

Name <- c("apple firm","苹果 firm","Ãpple firm")
Rank <- c(1,2,3)
data <- data.frame(Name,Rank)

我想删除包含非英文字符的名称 . 对于这个样本,只有“苹果公司”应该留下来 .

我试图使用 tm 包,但它只能帮我删除非英文字符而不是整个查询 .

3 回答

  • 7

    我会查看这个相关的Stack Overflow帖子,用于在javascript中执行相同的操作 . Regular expression to match non-English characters?

    要将其转换为R,您可以(匹配非ASCII):

    res <- data[which(!grepl("[^\x01-\x7F]+", data$Name)),]
    
    res
    # A tibble: 1 × 2
    #        Name  Rank
    #       <chr> <dbl>
    #1 apple firm     1
    

    并根据相同的SO帖子匹配非unicode:

    res <- data[which(!grepl("[^\u0001-\u007F]+", data$Name)),]
    
      res
    # A tibble: 1 × 2
    #        Name  Rank
    #       <chr> <dbl>
    #1 apple firm     1
    

    注意 - 我们必须取出 NUL 字符才能使用 . 因此,我们不是从 \u0000x00 开始,而是从 \u0001\x01 开始 .

  • 7

    stringi 包具有便利功能 stri_enc_isascii

    library(stringi)
    stri_enc_isascii(data$Name)
    # [1]  TRUE FALSE FALSE
    

    顾名思义,

    该函数检查字符串中的所有字节是否都在[ASCII]集1,2,...,127(来自?stri_enc_isascii)中 .

  • 4

    正则表达式的替代方法是使用 iconv 而不是过滤非NA条目:

    library(dplyr)
    data <- data %>% 
             mutate(Name = iconv(Name, from = "latin1", to = "ASCII")) %>%
             filter(!is.na(Name))
    

    mutate语句中发生的是字符串从latin1转换为ASCII . Here's a list latin1又名ISO 8859-1所涵盖的字符 . 当字符串包含不在latin1列表中的字符时,它不能转换为ASCII并变为NA .

相关问题