使用 dbplyr 将字符串拆分成行

Split string into rows with dbplyr

所以我想将一个字符串拆分成行,在本例中是 space。 我想使用 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, " "))

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

使用 purrr::map 和 purrr::reduce 与 dbplyr 联合函数输出,我尝试使用,但仍然无济于事:

非常感谢任何帮助,谢谢!

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

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

您可以使用的一种替代方法是找到第一个 space、trim 字符串并迭代:

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 附加到输出 table,检查 remainder 中的行数,将 df 替换为 remainder 并迭代。

注意str_locate找到第一个space的索引。在我的测试中,并非 SQL 的每一种风格都为此定义了翻译。所以这种方法可能会失败,具体取决于您的数据库。

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

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