#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