繁体   English   中英

如何将一列SQL拆分成r中的多列

[英]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分成两列: ch1ch2 ,如下所示:

# 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为主

我们可以按照问题中的方法编写一个 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 的SUBSTRINGCHARINDEXLEN函数可能具有不同的名称。 这些函数也可能采用不同的 arguments(例如 substring 的长度或子字符串末尾的索引)。 您将需要确保您拥有适合 SQL 风格的正确功能。

基于 dbplyr

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 服务器中, CHARINDEXstr_locate具有相同的用途。 因此,您可以使用CHARINDEX('a', ch)而不是str_locate('a', ch)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM