4

明らかに、私はまだlapplyが実際にどのように機能するかを完全には理解していません。もちろん、リスト要素に関数を適用してリストを返します。しかし、カスタム関数で使用する場合、効率的に使用する方法がわかりません。たとえば、dcastを使用するカスタム関数で使用したいと思います。

まず、サンプルデータセットを取得しましょう。

df1 <- data.frame(idx=c(rep("a",3),rep("b",3),rep("c",3)),
              cat=rep(1:3,3),var1=rnorm(9,0,1)
 )



df2 <- data.frame(idx=c(rep("a",4),rep("b",4),rep("c",4)),
              cat2=rep(1:4,3),var1=rnorm(12,0,1)
              )

mylist <- list(cat=df1,cat2=df2)


library(reshape2)

### result that I want to get just for one data.frame
dcast(df1,idx~cat,value_var="var1")

しかし、私はこれをlapplyに合わせることができません、私は試しました:

lapply(mylist,function(x) substitute(dcast(x,idx~x,value_var="var1")))
## returns
$cat
dcast(X[[2L]], idx ~ X[[2L]], value_var = "var1")

明らかに、式を評価するときにX[[2L]]は機能しません。さらに試してみました

lapply(names(mylist), function(x) dcast(mylist[[x]],idx~x,value_var="var1" ))

これはいくつかの同様の問題で機能していましたが、ここでエラーが発生しました。ここで使うべきですか?

編集:ジョシュアの答えがまさに私が望んでいるものであることに私は驚いています。私は前にその道を進んでいましたが、試したときに早くそれを却下しました:

 test <- function(x){
 myformula <- as.formula(paste("idx~",x,sep=""))
 myformula
 }

 test(df2) 
 ## returns
 ## > idx ~ c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3)
 ## > <environment: 0x104f0a4d8>

明らかに早すぎますが、何が起こるか説明できますか?

4

1 に答える 1

5

最初の例でxは、は関数に渡されるオブジェクトです。2番目の例では、これは文字列です。dataどちらの場合も、に渡される変数を表すシンボルではありませんdcast

list要素の名前を使用して式を作成する必要があるため、次のようになります。

# define the function
myfunc <- function(varname) {
  # 'varname' is a character string naming the column to use
  myformula <- as.formula(paste("idx~",varname,sep=""))
  dcast(mylist[[varname]], myformula, value_var="var1")
}
# loop over list elements, by name
lapply(names(mylist), myfunc)
于 2012-01-31T15:31:03.747 に答える