4

実験の複数の実行からの結果で構成されるデータフレームがあります。各実行はログとして機能し、独自の昇順カウンターがあります。以下のサンプルiterationのの個別の値ごとにの最大値を持つ別の列をデータフレームに追加したいと思います。experiment.num

df <- data.frame(
     iteration = rep(1:5,5), 
     experiment.num = c(rep(1,5),rep(2,5),rep(3,5),rep(4,5),rep(5,5)), 
     some.val=42,
     another.val=12
)

この例では、追加の列は次のようになります(すべてのサブセットの最大値が同じであるためiteration)。

df$max <- rep(5,25)

私が現在使用している素朴な解決策は次のとおりです。

df$max <- sapply(df$experiment.num,function(exp.num) max(df$iteration[df$experiment.num == exp.num]))

また、元のフレームとマージできる別のフレームを作成するために使用sapply(unique(df$experiment.num), function(n) c(n,max(df$iteration[df$experiment.num==n])))しましたが、これらのアプローチはどちらも必要以上に複雑に見えます。

列が要因であるため、experiment.numすべての行に対してこの単純なサブセット化を繰り返し実行することを回避するために、それを利用できる可能性があると思います。

のサブセットの最大値の列を取得するためのより良い方法はありdata.frameますか?

4

4 に答える 4

6

プライアの使用:

ddply(df, .(experiment.num), transform, max = max(iteration))
于 2012-06-13T14:50:36.250 に答える
3

aveベースRでの使用:

df$i_max <- with(df, ave(iteration, experiment.num, FUN=max))
于 2012-06-14T04:21:09.787 に答える
2

ベースRの方法は次のとおりです。

within(df[order(df$experiment.num), ], 
       max <- rep(tapply(iteration, experiment.num, max), 
                  rle(experiment.num)$lengths))
于 2012-06-13T15:25:16.107 に答える
1

私はあなたが使用できると思いますdata.table

install.packages("data.table")
library("data.table")
dt <- data.table(df) #make your data frame into a data table)
dt[, pgIndexBY := .BY, by = list(experiment.num)] #this will add a new column to your data table called pgIndexBY
于 2014-03-08T00:19:31.340 に答える