35

私はplyr構文が好きです。*apply() コマンドの 1 つを使用する必要があるときはいつでも、犬を蹴って 3 日間曲げることになります。私の犬と私の肝臓のために、データ フレームのすべての行に対して ddply 操作を行うための簡潔な構文は何ですか?

単純なケースでうまく機能する例を次に示します。

x <- rnorm(10)
y <- rnorm(10)
df <- data.frame(x,y)
ddply(df,names(df) ,function(df) max(df$x,df$y))

それはうまく機能し、私が望むものを与えてくれます。しかし、物事がより複雑になると、plyr はそれらすべての浮動小数点値から「レベル」を作成することを噛んでいるため、plyr はファンキーになります (Bootsy Collins とは異なります)。

x <- rnorm(1000)
y <- rnorm(1000)
z <- rnorm(1000)
myLetters <- sample(letters, 1000, replace=T)
df <- data.frame(x,y, z, myLetters)
ddply(df,names(df) ,function(df) max(df$x,df$y))

私の箱では、これは数分間噛んでから戻ります:

Error: memory exhausted (limit reached?)
In addition: Warning messages:
1: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
  Reached total allocation of 1535Mb: see help(memory.size)
2: In paste(rep(l, each = ll), rep(lvs, length(l)), sep = sep) :
  Reached total allocation of 1535Mb: see help(memory.size)

私は plyr を完全に悪用していると思います。これが plyr のバグだと言っているのではなく、私による虐待的な行動です (肝臓と犬にもかかわらず)。

要するに、ddply を使用してすべての行を操作するための構文のショートカットはありますapply(X, 1, ...)か?

私が使用してきた回避策は、すべての行に一意の値を与える「キー」を作成し、それに結合できるようにすることです。

 x <- rnorm(1000)
 y <- rnorm(1000)
 z <- rnorm(1000)
 myLetters <- sample(letters, 1000, replace=T)
 df <- data.frame(x,y, z, myLetters)
  #make the key
 df$myKey <- 1:nrow(df)
 myOut <- merge(df, ddply(df,"myKey" ,function(df) max(df$x,df$y)))
  #knock out the key
 myOut$myKey <- NULL

でも、「もっといい方法があるはずだ」とずっと思っています。

ありがとう!

4

1 に答える 1

44

それを配列のように扱い、各行で作業するだけです:

adply(df, 1, transform, max = max(x, y))
于 2010-01-15T21:17:56.883 に答える