data.framesをリストから新しい環境にコピーする場合は、envir
引数を使用するsqldf
か、リストの要素に名前を付けて、を使用できwith
ます。
いくつかの点に注意してください。
- notを
dflist
使用して作成します。list
c
違いに注意してください
str(c(df1,df2))
##List of 4
## $ CustomerId: int [1:6] 1 2 3 4 5 6
## $ Product : Factor w/ 2 levels "Radio","Toaster": 2 2 2 1 1 1
## $ CustomerId: num [1:3] 2 4 6
## $ State : Factor w/ 2 levels "Alabama","Ohio": 1 1 2
str(list(df1,df2))
##List of 2
## $ :'data.frame': 6 obs. of 2 variables:
## ..$ CustomerId: int [1:6] 1 2 3 4 5 6
## ..$ Product : Factor w/ 2 levels "Radio","Toaster": 2 2 2 1 1 1
## $ :'data.frame': 3 obs. of 2 variables:
## ..$ CustomerId: num [1:3] 2 4 6
## ..$ State : Factor w/ 2 levels "Alabama","Ohio": 1 1 2
- data.frames内の名前を反映するようにSQLクエリを調整しました(2番目のアプローチに従って)
名前付きデータ
dflist <- list(df1,df2)
names(dflist) <- c('df1','df2')
作業する新しい環境を作成する
# create a new environment
e <- new.env()
# assign the elements of dflist to this new environment
for(.x in names(dflist)){
assign(value = dflist[[.x]], x=.x, envir = e)
}
# this could also be done using mapply / lapply
# eg
# invisible(mapply(assign, value = dflist, x = names(dflist), MoreArgs =list(envir = e)))
# run the sql query
sqldf("select a.CustomerId, a.Product, b.State from df1 a
inner join df2 b on b.CustomerId = a.CustomerId", envir = e)
## CustomerId Product State
## 1 2 Toaster Alabama
## 2 4 Radio Alabama
## 3 6 Radio Ohio
を使用したより簡単なアプローチwith
ローカルで評価するものを使用するだけwith
で済みます(ここでは、dflistが名前付きリストであることが重要です)。
# this is far simpler!!
with(dflist,sqldf("select a.CustomerId, a.Product, b.State from df1 a
inner join df2 b on b.CustomerId = a.CustomerId"))
を使用した別の簡単なアプローチproto
- @ G.Grothendieckに感謝します(コメントを参照してください)
これは、proto
ロードされているパッケージを使用しますsqldf
dflist <- list(a = df1, b = df2)
sqldf( "select a.CustomerId, a.Product, b.State from df1 a
inner join df2 b on b.CustomerId = a.CustomerId",
envir = as.proto(dflist))
data.tableを使用する
または、アプローチdata.table
を提供するものを使用することもできます( FAQ 2.16を参照) 。sql-like
library(data.table)
dflist <- list(data.table(df1),data.table(df2))
names(dflist) <- c('df1','df2')
invisible(lapply(dflist, setkeyv, 'CustomerId'))
with(dflist, df1[df2])
## CustomerId Product State
## 1: 2 Toaster Alabama
## 2: 4 Radio Alabama
## 3: 6 Radio Ohio