2012-04-16 13 views
19
を送信する

私はddplyに呼び出しているカラム名に送信したいと考えています。例ddplyコール:カラム名をddplyに関数

ddply(myData, .(MyGrouping), summarise, count=sum(myColumnName)) 

私はddplyが別の関数内にラップしている場合は、それは私が呼び出し元の関数にmyColumnNameとして任意の値を渡すことができるようにこれをラップすることは可能でしょうか?

+0

再現可能な例がありますか? –

+0

@static_rttiあなたは具体的に 'plyr'答えをお探しですか?この質問は非常に古く、最近では高度なパッケージがあります。 –

+0

さて、私はplyrを使っています(さらに高度なパッケージについてはわかりませんが)。別のパッケージで同じ問題に答えることができれば、面白いと思います。 –

答えて

11

もっと良い方法があるはずです。そして、それを要約して動作させる方法を理解できませんでした。

my.fun <- function(df, count.column) { 
    ddply(df, .(x), function(d) sum(d[[count.column]])) 
} 

dat <- data.frame(x=letters[1:2], y=1:10) 

> my.fun(dat, 'y') 
    x V1 
1 a 25 
2 b 30 
> 
+0

count.columnを 'ddply'の関数に直接渡すことができます:' ddply(df、。(x)、function(d)sum(d [[count.column]))) 'は少ないコードを意味し、 'eval'を避けます。 –

+0

@TylerRinkerええ、そのevalは、私がそれを要約して動作させようとしていたときのホールドオーバーでした。編集されました。 – Justin

+0

私はこれも試みましたが(それ以来実際にはplyrをそれ以上使用していないので)、要約と一緒に動作させる方法も理解できませんでした。 –

7

それはおそらくこの状況でsummariseを避け、ジャスティンが示されているように、独自の匿名関数を記述するためにクリーン(かつ安全)となりますが、これは、動作しているように見えます。

yr <- "year" 

summarise(baseball, 
duration = max(eval(parse(text = yr))) - min(eval(parse(text = yr)))) 
4

@David Arenburgが言ったように、この質問はかなり古いです。今日、data.tableまたはdplyrパッケージは、あなたにはるかに速いスピードで同じ結果を与えることができます。

答えはdata.tableです。

library(data.table) 
my.fun <- function(myData, MyGrouping, myColumnName) { 
    setDT(myData)[, lapply(.SD, sum), by=MyGrouping, .SDcols=myColumnName] 
} 
0

私はを集計してを動作する方法を見つけたと思います。私はRで環境に対処するには専門家だが、ここでは解決策がありますので、私は、私は理由を理解かはわからない:

> library(plyr) 
> 
> 
> 
> ########################### 
> # Creating test DataFrame # 
> ########################### 
> 
> x <- 1:15 
> 
> set.seed(1) 
> y <- letters[1:3][sample(1:3, 15, replace = T)] 
> 
> df <- data.frame(x, y) 
> 
> ### check df 
> df 
    x y 
1 1 a 
2 2 b 
3 3 b 
4 4 c 
5 5 a 
6 6 c 
7 7 c 
8 8 b 
9 9 b 
10 10 a 
11 11 a 
12 12 a 
13 13 c 
14 14 b 
15 15 c 
> 
> 
> ##################### 
> # auxiliar function # 
> ##################### 
> evalString <- function(s) { 
+ eval(parse(text = s), parent.frame()) 
+ } 
> 
> 
> ### columnName input 
> columnName <- 'x' 
> 
> ### call with columnName as input 
> xMeans <- ddply(df, 
+     'y', 
+     summarise, 
+     mean = mean(evalString(columnName))) 
> 
> 
> ### regular call to ddply 
> xMeans2 <- ddply(df, 
+     'y', 
+     summarise, 
+     mean = mean(x)) 
> 
> 
> ### Compare Results 
> xMeans 
    y mean 
1 a 7.8 
2 b 7.2 
3 c 9.0 
> xMeans2 
    y mean 
1 a 7.8 
2 b 7.2 
3 c 9.0 
> 

はEDIT:示唆したようにあなたは、基本パッケージからget機能を使用することができますここでは:ddply: how do I pass column names as parameters?

> xMeans3 <- ddply(df, 
+     'y', 
+     summarise, 
+     mean = mean(get(columnName))) 
> 
> xMeans3 
    y mean 
1 a 7.8 
2 b 7.2 
3 c 9.0