【问题标题】:Keep only first word in Column RSQLite仅保留 RSQLite 列中的第一个单词
【发布时间】:2019-03-07 15:55:44
【问题描述】:

我正在将 SQL 代码转移到 R。

我有一个数据集,想从新列的列中提取第一个单词。

数据集

 df

        Col_A    ColB
  ABC JEn JDn       9
  nemmdn mend      10
pwek ne me ne      12

预期输出:

        Col_A    ColB    Col_A_Abbreviation
  ABC JEn JDn       9                   ABC
  nemmdn mend      10                nemmdn
pwek ne me ne      12                  pwek

以下是我目前拥有的:

library(DBI)
library(RSQLite)
mydb <- dbConnect(RSQLite::SQLite(), "")
dbWriteTable(mydb, "df_1", df)

dbGetQuery(mydb, 
'SELECT IF(INSTRB(Col_A, \' \', 1, 1) >0, 
SUBSTR(Col_A, 1, INSTRB(Col_A, \' \', 1, 1) - 1), 
Col_A) AS Col_A_Abbreviation FROM df_1')

这是我的错误信息:

Error in result_create(conn@ptr, statement) : no such function: IF

RSQLite 对它可以使用的功能有限制吗?

【问题讨论】:

  • SQLite 使用CASE
  • 谢谢,当我这样做时,现在它会显示Error in result_create(conn@ptr, statement) : near "AS": syntax error

标签: r rsqlite


【解决方案1】:

1) sqldf/RSQLite 如果您使用的是 SQLite 后端,那么您只能使用 RSQLite 支持的函数。试试这个,df 在最后的注释中被重复定义。

library(sqldf)
sqldf("select 
    *, 
    substr([Col_A], 1, instr([Col_A], ' ') - 1) FirstWord 
  from df")

给予:

          Col_A ColB FirstWord
1   ABC JEn JDn    9       ABC
2   nemmdn mend   10    nemmdn
3 pwek ne me ne   12      pwek

1a) 如果条目只能包含一个单词,则在末尾附加一个空格以确保始终至少有一个空格可以匹配。

sqldf("select 
    *, 
    substr([Col_A], 1, instr([Col_A] || ' ', ' ')-1) FirstWord 
  from df")

2) 基础R

在基础 R 中,删除第一个空格及其后面的所有内容:

transform(df, FirstWord = sub(" .*", "", Col_A))

注意

df <-
structure(list(`Col_A` = c("ABC JEn JDn", "nemmdn mend", "pwek ne me ne"
), `ColB` = c(9L, 10L, 12L)), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

    【解决方案2】:

    除了 Clemsang 的评论,为什么在从数据集中得到结果后不使用strsplit()

    类似这样的:

    a <- c("ABC Jen JDn", "nemmdn mend", "pwek ne me ne")
    b <- sapply(strsplit(a, " "), "[", 1)
    

    【讨论】:

    • 谢谢,不幸的是我需要在 SQL 中完成
    • 那么您应该像 Clemsang 建议的那样将 CASEWHENTHEN 添加到您的查询中。见这里:sqlitetutorial.net/sqlite-case
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2021-12-04
    • 2021-06-12
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    相关资源
    最近更新 更多