#r #dplyr #rsqlite
Вопрос:
У меня есть чрезмерно большие данные, сохраненные в базе данных SQLite. Мне нужно перекодировать значения некоторых столбцов, но, к сожалению, мой код генерирует ошибку, которую я действительно не могу отладить. Вот код, который я использую.
library(RSQLite)
library(inborutils)
library(dplyr)
library(dbplyr)
db <- dbConnect(SQLite(), dbname = "ukbb.sqlite")
dbListTables(db)
bd <- tbl(db, "Uk_Bb")
bd %>%
mutate(f.19.0.0 = recode(bd, f.19.0.0, '1' = "Direct entry",
'2' = "Manual entry",
'3' = "Not performed",
'6' = "Not performed - equipment failure",
'7' = "Not performed - other reason",
.default = NULL))
f.19.0.0 является столбцом в таблице и имеет следующие значения: —
bd %>% select(f.19.0.0)
# Source: lazy query [?? x 1]
# Database: sqlite 3.36.0 [C:Users*****DownloadsUkBBukbb.sqlite]
f.19.0.0
<dbl>
1 1
2 1
3 1
4 NA
5 1
6 NA
7 NA
8 1
9 1
10 1
# ... with more rows
Ошибка, которую я получаю, заключается в том, что
Ошибка в методе использования(«escape») : неприменимый метод «escape «не применяется к объекту класса «c («tbl_SQLiteConnection», «tbl_dbi», «tbl_sql», «tbl_lazy», «tbl») » Кроме того: Предупреждение: Именованные аргументы игнорируются при перекодировании SQL
Любая помощь/объяснение для решения этой проблемы очень ценится!
Ответ №1:
Из того, что я понимаю о вашей ошибке , ваш код неправильно переводится обратно в SQL ::dbplyr()
, я не уверен, что это сработает, но я попытался предоставить функции mutate более похожую на SQL альтернативу recode()
, case_when()
. Попробуй это и посмотри, как пойдешь:
library(tidyverse)
bd %>%
mutate(
f.19.0.0 =
case_when(
f.19.0.0 == 1 ~ "Direct entry",
f.19.0.0 == 2 ~ "Manual entry",
f.19.0.0 == 3 ~ "Not performed",
f.19.0.0 == 6 ~ "Not performed - equipment failure",
f.19.0.0 == 7 ~ "Not performed - other reason",
TRUE ~ NA_character_
)
)
Комментарии:
1. Спасибо за помощь!