3

R/plyrで関数を書く方法を学ぼうとしています。以下に示すことを行うためのより簡単な方法があることは承知していますが、それは重要ではありません。

次の例では、PLYR は新しいデータ フレームに新しい変数を返しません。

library(plyr)
highab <-subset(baseball, ab >= 600)

testfunc1 <-function(x) {
    print(x) #just to show me that the vector does get into the function. Works fine.
    medianAB <- median(x)
    print(medianAB) #just to prove that medianAB was calculated correctly. Works fine   
}


baseball3 <-ddply(highab, .(id), transform, testfunc1(ab))
str(baseball3$medianAB) #No medianAB

私が見逃している明らかなことは何ですか?

R version 2.12.2 (2011-02-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C               LC_TIME=en_CA.UTF-8        LC_COLLATE=en_CA.UTF-8    
 [5] LC_MONETARY=C              LC_MESSAGES=en_CA.UTF-8    LC_PAPER=en_CA.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] grid      splines   stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] foreign_0.8-42  ggplot2_0.8.9   proto_0.3-9.1   reshape_0.8.4   plyr_1.4.1      rms_3.3-0       Hmisc_3.8-3    
[8] survival_2.36-5 stringr_0.4    

loaded via a namespace (and not attached):
[1] cluster_1.13.3  lattice_0.19-23 tools_2.12.2   
4

3 に答える 3

3

2つの変更を加えるだけです

  1. 中央値が返されるように、関数内の印刷コマンドを削除します
  2. medianAB = testfunc1(ab)ジョシュアの提案に従って追加

これで完了です。

出力付きの簡略化されたコードは次のとおりです

library(plyr)
highab <-subset(baseball, ab >= 600)
baseball3 <-ddply(highab, .(id), transform, medianAB = median(ab))
summary(baseball3$medianAB)

最小。第 1 区 中央値平均第 3 四半期
最大。600.0 612.0 621.5 623.1 631.5 677.0

于 2011-04-14T19:40:21.433 に答える
0

ごめん。私はその質問を誤解した。

を参照してください?transform。必要な新しい変数をtag=valueペアとして指定する必要があります。だからあなたは次のようなものが必要です

baseball3 <- ddply(highab, .(id), transform, medianAB=testfunc1(ab))
于 2011-04-14T19:09:58.587 に答える
0

最初は、派生列を data.frame に追加するイディオムが気に入りましたが、transform()許容できないほど遅い非常に大きなセットの使用法を見つけました。

でラムダ形式を使用しddply()、その後に merge を呼び出した方がよいでしょうmerge()か? それだけの価値があるように見えるタイミング:

    > library(plyr)
    > highab <-subset(baseball, ab >= 600)
    > 
    > system.time( 
    +   baseball3.lambda <-merge(highab, 
    +     ddply(highab, .(id), 
    +       function(u) data.frame(medianAB = median(u$ab)))), FALSE)
       user  system elapsed 
      0.336   0.000   0.336 
    > 
    > system.time( 
        baseball3.orig <- ddply(highab, .(id), 
          transform, medianAB = median(ab)), FALSE)
       user  system elapsed 
      0.640   0.000   0.641 
    > 
    > summary(baseball3.lambda$medianAB)
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      600.0   612.0   621.5   623.1   631.5   677.0 
    > summary(baseball3.orig$medianAB)
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      600.0   612.0   621.5   623.1   631.5   677.0 

10 分の 3 秒は大したことではないように思えるかもしれませんが、実行時間が半分になっています。データセット全体を選択することで、改善はさらに大きくなりbaseballます。

于 2012-04-25T09:31:32.020 に答える