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

时间:2017-03-27 14:21:50

标签: r text

这是我的样本数据集:

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

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

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

3 个答案:

答案 0 :(得分:8)

我会查看这个相关的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开始。

答案 1 :(得分:7)

stringi包具有便捷功能stri_enc_isascii

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

顾名思义,

  

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

答案 2 :(得分:4)

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

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

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