Сохранить только первое слово в столбце RSQLite

#r #rsqlite

#r #rsqlite

Вопрос:

Я работаю над переносом 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 ограничения на то, какие функции он может использовать?

Комментарии:

1. SQLite использует CASE

2. Спасибо, когда я это делаю, теперь он говорит Error in result_create(conn@ptr, statement) : near "AS": syntax error

Ответ №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)
  

Комментарии:

1. Спасибо, мне нужно, чтобы это было сделано на SQL, хотя, к сожалению

2. Затем вы должны добавить CASE , WHEN и THEN в свой запрос, как предложил Клемсанг. Смотрите здесь: sqlitetutorial.net/sqlite-case