【问题标题】:Finding Farsi or non English text in a file在文件中查找波斯语或非英语文本
【发布时间】:2019-12-22 05:51:41
【问题描述】:

我有一个加载到 R studio 的原始数据(csv 文件),我想提取其中包含非英语数据的那些列,我怎么可能做到这一点?

【问题讨论】:

  • 这能回答你的问题吗? detect non ascii characters in a string。如果没有,您能否添加示例数据并澄清您的问题?
  • @DJV 是的,就像我有一个 csv 文件,其中列有名称、姓氏、城市、地址,假设城市可能有如下名称:纽约、德里、کابل、تهران 所以我想找到那些列名不是英文的值
  • 偶然发现:grepl("[^ -~]", x)。这匹配任何非 ASCII 字符;欲了解更多信息,请查看catonmat.net/blog/my-favorite-regex
  • 例如:x <- c("New York", "Delhi", "کابلت هران", "ü", "ß") grepl("[^ -~]", x) [1] FALSE FALSE TRUE TRUE TRUE

标签: r


【解决方案1】:

您可以使用stringi 包。

我将使用@Chris Ruehlemann 示例数据。

样本数据:

x <- c("New York", "Delhi", "کابلت هران", "ü", "ß") 

library(stringi)

grepl("[[:cntrl:]]", stringi::stri_enc_toascii(x))

这会给你一个TRUE/FALSE 输出:

[1] FALSE FALSE  TRUE  TRUE  TRUE

接下来,您可以提取非英文值:

x[grepl("[[:cntrl:]]", stringi::stri_enc_toascii(x))]
[1] "کابلت هران" "ü"          "ß" 

如果您愿意,也可以使用基本 R 解决方案:

grepl("[^ -~]", x)

这会给你类似的结果:

[1] FALSE FALSE  TRUE  TRUE  TRUE

但是,如果您要对这两个函数进行基准测试,stringi::stri_enc_toascii 会更快。

library(rbenchmark)

# sample data
y <- sample(x, 1000, replace = TRUE)

benchmark(
  "stringi" = {
    grepl("[[:cntrl:]]", stringi::stri_enc_toascii(y))
    },
"baseR" = {
  grepl("[^ -~]", y)
},
replications = 1000,
columns = c("test", "replications", "elapsed",
            "relative", "user.self", "sys.self"))

     test replications elapsed relative user.self sys.self
2   baseR         1000    0.96    5.053      0.96     0.00
1 stringi         1000    0.19    1.000      0.19     0.01

【讨论】:

    【解决方案2】:

    由于您说要在数据框中选择名称包含非 ASCII 字符的 ,因此这里有一个简单的 R 基础解决方案。 假设您的数据具有以下结构:

    df <- data.frame(
      NY = c("some", "data", "more", "data"),
      Delhi = c("some", "data", "more", "data"),
      کابل = c("some", "data", "more", "data"),
      ß = c("some", "data", "more", "data")
    )
    df
        NY Delhi کابل    ß
    1 some  some some some
    2 data  data data data
    3 more  more more more
    4 data  data data data
    

    那么您所要做的就是使用grepl 在感兴趣的列上子集df 以在colnames 中查找模式[^ -~] 的匹配项:

    df[ , grepl("[^ -~]", colnames(df))]
      کابل    ß
    1 some some
    2 data data
    3 more more
    4 data data
    

    【讨论】:

    • 谢谢,但我说我工作的列中的数据如下,但执行需要一点时间
    • raw_data
    • #为to_be_translated数据框uuid创建变量
    • for(coli in 1:ncol(raw_data)){ for(rowi in 1:nrow(raw_data)){ result
    • 抱歉,我看不到您要与我交流的内容。到目前为止,您收到的两个答案是否没有回答了您的问题?如果是这样,你能清楚地说明缺少什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多