使用 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 中,服务器 CHARINDEX
与 str_locate
具有相同的用途。因此你可以使用 CHARINDEX(' ', TEXT)
而不是 str_locate(' ', TEXT)
.
所以我想将一个字符串拆分成行,在本例中是 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 中,服务器 CHARINDEX
与 str_locate
具有相同的用途。因此你可以使用 CHARINDEX(' ', TEXT)
而不是 str_locate(' ', TEXT)
.