5

私はRを初めて使用します。主にggplot2ライブラリを使用して統計を視覚化するために使用します。今、私はデータ準備の問題に直面しています。

指定された列で最高値と最低値を持つデータフレームからいくつかの数(2、5、または10)の行を削除し、それらを別のデータフレームに配置する関数を作成し、2つの要素の組み合わせごとにこれを行う必要があります(私の場合: 各日とサーバー)。

ここまでで、次の手順を実行しました (esophサンプル データセットを使用した MWE)。

目的のパラメーターに従ってフレームを並べ替えました (ncontrols例):

esoph<-esoph[with(esoph,order(-ncontrols)) ,]

各因子値の最初/最後のレコードを表示できます (この例では、年齢範囲ごと):

by(data=esoph,INDICES=esoph$agegp,FUN=head,3)
by(data=esoph,INDICES=esoph$agegp,FUN=tail,3)

基本的に、最高値と最低値はわかりますが、それらを別のデータフレームに抽出する方法と、メインのデータフレームから削除する方法がわかりません。

また、上記の例では、1 つの因子 (年齢範囲) の各値の上位/下位のレコードを確認できますが、実際には、2 つの因子の各値の最高記録と最低記録を知る必要があります。この例では、agegpalcgp.

これらの上記の手順が問題ないかどうかさえわかりません-おそらく使用plyrするとうまくいくでしょうか? ヒントをいただければ幸いです。

4

2 に答える 2

3

plyrはい、次のように使用できます。

esoph <- data.frame(agegp = sample(letters[1:2], 20, replace = TRUE),
                    alcgp = sample(LETTERS[1:2], 20, replace = TRUE),
                    ncontrols = runif(20))

ddply(esoph, c("agegp", "alcgp"),
      function(x){idx <- c(which.min(x$ncontrols),
                           which.max(x$ncontrols))
                  x[idx, , drop = FALSE]})
#   agegp alcgp  ncontrols
# 1     a     A 0.03091483
# 2     a     A 0.88529790
# 3     a     B 0.51265447
# 4     a     B 0.86111649
# 5     b     A 0.28372232
# 6     b     A 0.61698401
# 7     b     B 0.05618841
# 8     b     B 0.89346943

ddply(esoph, c("agegp", "alcgp"),
      function(x){idx <- c(which.min(x$ncontrols),
                           which.max(x$ncontrols))
                  x[-idx, , drop = FALSE]})
#    agegp alcgp ncontrols
# 1      a     A 0.3745029
# 2      a     B 0.7621474
# 3      a     B 0.6319013
# 4      b     A 0.3055078
# 5      b     A 0.5146028
# 6      b     B 0.3735615
# 7      b     B 0.2528612
# 8      b     B 0.4415205
# 9      b     B 0.6868219
# 10     b     B 0.3750102
# 11     b     B 0.2279462
# 12     b     B 0.1891052

データが既にソートされている場合headなど、 andを使用するなど、おそらく多くの代替手段がありますが、これは機能するはずです。tail

于 2012-11-16T11:53:21.393 に答える