【问题标题】:Split string into rows with dbplyr使用 dbplyr 将字符串拆分为行
【发布时间】:2021-11-28 10:56:42
【问题描述】:

所以我想将一个字符串(在这种情况下是一个空格)拆分成行。 我想使用 dbplyr 来做到这一点,这被证明是一个问题。 显然,如果我在那里收集大量的方法来做到这一点。 虽然我需要在不收集的情况下这样做。 这是一些虚拟数据,一种收集方式,同样的方式不收集就无法工作

 library(dbplyr)
 library(dplyr)
 library(tidyr)

 con <- DBI::dbConnect(...)

 df <- tbl(
   src = con,
   from = sql(
   "SELECT 1 AS ID, 'I LIKE CATS' AS TEXT FROM DUAL
   UNION ALL
   SELECT 2 AS ID, 'I LIVE IN A BIG HOUSE' AS TEXT FROM DUAL
   UNION ALL
   SELECT 3 AS ID, 'ARE THERE MANY ORANGES IN THE CUPBOARD' AS TEXT FROM DUAL")
 )

 df %>% 
   collect() %>% 
   mutate(WORD = strsplit(TEXT, " ")) %>% 
   unnest(WORD)

 df %>% 
   mutate(WORD = strsplit(TEXT, " "))

这里有一个类似的(ish)问题没有得到解答:How to split one SQL column into multiple columns in r

我尝试使用 purrr::map 和 purrr::reduce 与 dbplyr 来合并函数输出,但仍然无济于事:Using purrr::map2() with dbplyr

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: r tokenize purrr strsplit dbplyr


    【解决方案1】:

    我建议首先在文本中找到空格 " "。如果您知道每个字符串中空格的位置,那么使用 dbplyr 可以将其转换为 SQL 的 substr 可以直接获取空格之间的文本。

    找到文本中所有空格的位置(当存在非常数时)在 SQL 中并非易事。最好的方法似乎是通过嵌套 SQL 查询 (as per this answer),您无法使用 dbplyr 翻译编写。

    您可以使用的另一种方法是找到第一个空格,修剪字符串并迭代:

    library(dplyr)
    library(dbplyr)
    library(stringr)
    
    out1 <- df %>%
      mutate(first_space = str_locate(' ', TEXT)) %>%
      mutate(first_word = substr(TEXT, 1, first_space - 1),
             remaining_text = substr(TEXT, first_space + 1, nchar(TEXT)))
    
    keep <- out %>%
      select(ID, first_word) %>%
      rename(WORD = first_word)
    
    remainder <- out %>%
      select(ID, remaining_text) %>%
      filter(!is.na(remaining_text)) %>%
      rename(TEXT = remaining_text)
    

    然后我会将keep 附加到输出表中,检查remainder 中的行数,将df 替换为remainder 并进行迭代。

    注意str_locate 查找第一个空格的索引。在我的测试中,并不是每种 SQL 都为此定义了翻译。因此,根据您的数据库,这种方法可能会失败。

    但是,每种 SQL 风格都应该具有等效的功能。您应该可以直接输入此函数,并且由于 dbplyr 没有为其定义翻译,因此该函数应未经翻译传递给服务器。

    例如,在 SQL 服务器中,CHARINDEXstr_locate 具有相同的用途。因此,您可以使用CHARINDEX(' ', TEXT) 而不是str_locate(' ', TEXT)

    【讨论】:

    • 感谢您的回复。我正在使用 SQL Oracle Developer,所以 str_locate 不起作用,正如您所认为的那样。但是,如果我可以在 mutate 中使用本机 SQL 函数,那么就有很多工作要做。从来不知道你能做到这一点,超级有用,干杯!
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2016-01-02
    • 2015-12-28
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多