2014-03-27 6 views
1

데이터베이스 파일에 SQLite 데이터베이스 연결이 있습니다. 테이블 중 하나에서 일부 데이터를 추출하고 R에서 일부 처리를 수행 한 다음 처리 된 데이터에서 동일한 연결에 임시 테이블을 작성하려고합니다. 사용자는 데이터베이스에 대한 쓰기 권한이 없기 때문에 임시 테이블이어야하지만 데이터베이스에 이미있는 데이터와 함께이 새 데이터를 쿼리 할 수 ​​있기를 원합니다.R 데이터 프레임에서 SQLite 임시 테이블을 추가하는 방법은 무엇입니까?

때문에, 예를 들면 :

dbWriteTable(conn=db, name= "iris_proc", value = d) 

하지만 I :

require(sqldf) 

db <- dbConnect(SQLite(), "tempdb") 
dbWriteTable(db, "iris", iris) 

# do some processing in R: 
d <- dbGetQuery(db, "SELECT Petal_Length, Petal_Width FROM iris;") 
names(d) <- c("length_2", "width_2") 
d <- exp(d) 

후 나는 내가 할 수있는 알고 d

에서 연결 db에 임시 테이블을 만들고 싶어 임시 테이블에서 필요하며 dbWriteTable에 옵션이없는 것 같습니다.

dbGetQuery(db, paste("UPDATE iris2 SET length_2 =", paste(d$length_2, collapse = ", "), ";")) 
Error in sqliteExecStatement(con, statement, bind.data) : 
    RS-DBI driver: (error in statement: near "4.05519996684467": syntax error) 
: 컬럼에 d에서 데이터를

dbGetQuery(db, "CREATE TEMP TABLE iris_proc AS SELECT Species FROM iris;") 
dbGetQuery(db, "ALTER TABLE iris_proc ADD COLUMN length_2;") 

을하지만 내가 얻을 수 없다 : 내가 생각

한 가지 해결 방법은 임시 테이블을 추가 한 다음 열을 추가하고 업데이트하는 것이 었습니다

나는 이것을 작동 시키더라도 무섭게 비효율적이라고 상상해 봅니다.

read.csv.sql을 사용하여이 작업을 수행 할 수있는 방법이 있다고 생각했지만 오픈 연결 개체에서는 작동하지 않습니다.

+0

는'temporary' 매개 변수 – hadley

답변

1

를 사용하여 임시 테이블에 대한 메모리 데이터베이스 :

library(RSQLite) 

db <- dbConnect(SQLite(), "tempdb") 
dbWriteTable(db, "iris", iris) 
d <- dbGetQuery(db, "SELECT Petal_Length, Petal_Width FROM iris") 
d <- exp(d) 

dbGetQuery(db, "attach ':memory:' as mem") 
dbWriteTable(db, "mem.d", d, row.names = FALSE) # d now in mem database 

dbGetQuery(db, "select * from iris limit 3") 
dbGetQuery(db, "select * from mem.d limit 3") 

dbGetQuery(db, "select * from sqlite_master") 
dbGetQuery(db, "select * from mem.sqlite_master") 
+0

완벽한을 추가 DEV 버전, 감사합니다! 이것으로 나는 새로운 in-memory 데이터베이스를 만들 필요조차 없지만 이미 존재하는 임시 데이터베이스를 사용할 수 있습니다 : dbWriteTable (db, "temp.d", d, row.names = FALSE)' – dspringate