![](/img/trans.png)
[英]SQL How to Split One Column WIth 2 Different Delimiters into Multiple Variable Columns
[英]How to split one SQL column into multiple columns in r
我在 R 中通过 dbplyr::memdb_frame() 创建了一个 tbl_SQLiteConnection object。
library(dbplyr)
library(dplyr)
tb=memdb_frame(data.frame(ch=c('1a1','2a3'),cq=c(1,2)))
tb
# Source: table<dbplyr_002> [?? x 2]
# Database: sqlite 3.33.0 [:memory:]
ch cq
<chr> <dbl>
1 1a1 1
2 2a3 2
我想将ch
a
分成两列: ch1
和ch2
,如下所示:
# Source: table<dbplyr_004> [?? x 3]
# Database: sqlite 3.33.0 [:memory:]
ch1 ch2 cq
<dbl> <dbl> <dbl>
1 1 1 1
2 2 3 2
我尝试这样的事情
sq <- paste0('SELECT split_part(ch,"a",1)
FROM (',sql_render(tb),')')
tbl(tb$src$con,sql(sq))
这是行不通的!!!
你能帮我在 R 中如何进行吗?
这是否有效:
library(dplyr)
library(tidyr)
tb %>% separate(col = ch, into = c('ch1','ch2'), sep = 'a')
ch1 ch2 cq
1 1 1 1
2 2 3 2
If the question is how to separate the indicated column in a data frame into two using an SQLite select statement in R then the following select statement uses SQLite's instr and substr functions.
library(sqldf)
tb <- data.frame(ch = c('1a1', '2a3'), cq = c(1, 2))
sqldf("
select
substr(ch, 1, instr(ch, 'a') - 1) as ch1,
substr(ch, instr(ch, 'a') + 1) as ch2,
cq
from tb")
给予:
ch1 ch2 cq
1 1 1 1
2 2 3 2
根据我对这个问题的回答,这里有两种方法。 两者都假设您不知道字符串中分隔符(在本例中'a'
)的位置,因此这是第一步。 如果您的拆分字符始终位于相同的 position 中,则可以简化该方法(例如,它始终是字符串中的第二个字符,如上例所示)。
我们可以按照问题中的方法编写一个 SQL 查询并将其传递给表定义:
query = paste0("
SELECT ch, cq, split_index
,SUBSTRING(ch, 1, split_index - 1) AS ch1
,SUBSTRING(ch, split_index + 1, LEN(ch)) AS ch2
FROM (
SELECT ch, cq, CHARINDEX('a', ch) AS split_index
FROM ", sql_render(input_tbl), "
) AS subquery"
tbl(input_tbl$src$con, sql(query))
请注意,不同类型的 SQL 的SUBSTRING
、 CHARINDEX
和LEN
函数可能具有不同的名称。 这些函数也可能采用不同的 arguments(例如 substring 的长度或子字符串末尾的索引)。 您将需要确保您拥有适合 SQL 风格的正确功能。
dbplyr 可以将一些标准的 R 和 dplyr 命令翻译成 SQL。这样你就可以编写 R 并将其自动翻译成 SQL。
lubrary(dbplyr)
library(stringr)
input_tbl %>%
mutate(split_index = str_locate('a', ch) %>%
mutate(ch1 = substr(ch, 1, split_index - 1),
ch2 = substr(ch, split_index + 1, nchar(ch)))
注意: str_locate
查找拆分字符的索引。 在我的测试中,并非 SQL 的每一种风格都为此定义了翻译。 因此,这种方法可能会失败,具体取决于您的数据库。
但是,您可以直接使用等效的 SQL function。 因为 dbplyr 没有为其定义翻译,所以 function 应该未翻译地传递给服务器。
例如,在 SQL 服务器中, CHARINDEX
与str_locate
具有相同的用途。 因此,您可以使用CHARINDEX('a', ch)
而不是str_locate('a', ch)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.