这是我的示例数据集:
Name <- c("apple firm","苹果 firm","Ãpple firm") Rank <- c(1,2,3) data <- data.frame(Name,Rank)
我想删除包含非英文字符的名称 . 对于这个样本,只有“苹果公司”应该留下来 .
我试图使用 tm 包,但它只能帮我删除非英文字符而不是整个查询 .
tm
我会查看这个相关的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 开始 .
NUL
\u0000
x00
\u0001
\x01
stringi 包具有便利功能 stri_enc_isascii :
stringi
stri_enc_isascii
library(stringi) stri_enc_isascii(data$Name) # [1] TRUE FALSE FALSE
顾名思义,
该函数检查字符串中的所有字节是否都在[ASCII]集1,2,...,127(来自?stri_enc_isascii)中 .
正则表达式的替代方法是使用 iconv 而不是过滤非NA条目:
iconv
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 .
3 回答
我会查看这个相关的Stack Overflow帖子,用于在javascript中执行相同的操作 . Regular expression to match non-English characters?
要将其转换为R,您可以(匹配非ASCII):
并根据相同的SO帖子匹配非unicode:
注意 - 我们必须取出
NUL
字符才能使用 . 因此,我们不是从\u0000
或x00
开始,而是从\u0001
和\x01
开始 .stringi
包具有便利功能stri_enc_isascii
:顾名思义,
正则表达式的替代方法是使用
iconv
而不是过滤非NA条目:mutate语句中发生的是字符串从latin1转换为ASCII . Here's a list latin1又名ISO 8859-1所涵盖的字符 . 当字符串包含不在latin1列表中的字符时,它不能转换为ASCII并变为NA .