代码之家  ›  专栏  ›  技术社区  ›  nak5120

只保留RSQLite列中的第一个单词

  •  0
  • nak5120  · 技术社区  · 7 年前

    我正致力于将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对它可以使用哪些功能有限制吗?

    0 回复  |  直到 7 年前
        1
  •  1
  •   G. Grothendieck    7 年前

    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
    

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

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

    在基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
  •  0
  •   Kurt    7 年前

    除了克莱姆桑的评论,为什么不使用 strsplit()

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