【问题标题】:Cleaning strings in sparklyr using regex使用正则表达式在 sparklyr 中清理字符串
【发布时间】:2020-11-06 10:49:40
【问题描述】:

我正在尝试使用 regexp_replace 在 sparklyr 中清理表中的字符串。我需要删除单词之间的多个空格和特定的整个单词。

建立 Spark 连接

pharms <- spark_read_parquet(sc, 'pharms', 's3/path/to/pharms', infer_schema = TRUE, memory = FALSE)

要清理的向量

我要清理的 df 向量看起来像这样,但它位于 sparklyr 连接的表中:

drug_strings <- c("tablomiacin sodium tab      mg", "nsaid  caps  mg")

正则表达式处理数据后所需的输出将是这样的:

期望的结果

[1] "tablomiacin sodium", "nsaid"

尝试

我尝试了正则表达式中使用的各种组合,例如:

pharms_cln <- pharms %>%
  distinct(drug_strings)%>%
  mutate(new_strings=regexp_replace(drug_strings, "\\b(caps|mg|tab)\\b", ""))

pharms_cln <- pharms %>%
  distinct(drug_strings)%>%
  mutate(new_strings=regexp_replace(drug_strings, "\\s+", ""))

但它们都只是替换所有字母或子字符串,而不仅仅是单个单词或打印与 hive 相关的错误。同样,我尝试删除空格的努力似乎只是删除了字母's'。

【问题讨论】:

  • 那么适用于寻求替换的规则是什么:caps|mg|tab 之前的任何内容?
  • nsaid caps 之间有两个空格,对吗?
  • 是的,基本上我已经清除了非字母字符。
  • 更新后的答案对您有用吗?

标签: r regex tidyverse sparklyr


【解决方案1】:

如果寻求替换的规则“caps|mg|tab 之前的任何内容”,那么这可能有效:

数据:

drug_strings <- c("tablomiacin sodium tab      mg", "nsaid  caps  mg") 

解决方案:

trimws(gsub("\\b(tab|mg|caps)\\b", "", drug_strings))
[1] "tablomiacin sodium" "nsaid"

如果由于某种原因你需要使用str_extract,你可以这样做:

str_extract(gsub("\\s{2,}", " ", drug_strings), "\\b\\w+\\b(\\s\\b\\w+\\b)*(?=\\s\\b(tab|mg|caps)\\b)")

这首先将所有多个空白字符减少为一个这样的字符,然后进行提取。

【讨论】:

  • 这让我分道扬镳。有一些复杂的药物,其中包含多个单词 一种解决方法是标记化然后粘贴,但这是低效的。我将编辑我的问题以反映复杂性谢谢!
  • 更新了一个更好的例子。
【解决方案2】:

知道正则表达式的人当然可以简化此代码,但以下使用 stringr 包中的 str_remove 函数。

drug_strings <- c("tablomiacin tab      mg", "nsaid  caps  mg")

drug_strings <- data.frame(drug_strings)

drug_strings <- drug_strings %>% 
mutate(new_strings=str_remove(drug_strings, "\\b(caps|mg|tab)\\b")) %>% 
mutate(new_strings=str_remove(new_strings, "\\s+")) %>% 
mutate(new_strings = str_remove(new_strings, "mg"))
``

【讨论】:

  • 让我在 sparklyr 中试试这个。这就是我要找的。也许我的例子需要更好地反映这一点。
  • 它会导致 Hive 相关错误:错误:org.apache.spark.sql.AnalysisException:未定义函数:'STR_REMOVE'。该函数既不是注册的临时函数,也不是在数据库“默认”中注册的永久函数。第 1 行 pos 7
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多