这是我的样本数据集:
Name <- c("apple firm","苹果 firm","Ãpple firm")
Rank <- c(1,2,3)
data <- data.frame(Name,Rank)
我想删除包含非英文字符的名称。对于这个样本,只有“苹果公司”应该留下来。
我尝试使用tm
包,但它只能帮助我删除非英文字符而不是整个查询。
答案 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
字符才能生效。因此,我们不是从\u0000
或x00
开始,而是从\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。