5

多くの場合、1 つ以上の変数によってグループ化されたデータがあり、各グループ内に複数の登録があります。データ フレームから、さまざまな基準に従ってグループを選択したいと考えています。

私は通常、論理ベクトルを使用してリストから要素を抽出する分割-適用-rbind アプローチを使用します。

ここに小さな例があります。1 つのグループ化変数 (「グループ」) を持つデータ フレームから開始し、最大質量が 45 未満のグループを選択したいと考えています。

dd <- data.frame(group = rep(letters[1:3], each = 5), 
                 mass = c(rnorm(5, 30), rnorm(5, 50), 
                          rnorm(5, 40)))
    dd2 <- split(x = dd, f = dd$group)
    dd3 <- dd2[sapply(dd2, function(x) max(x$mass) < 45)]
    dd4 <- do.call(rbind, dd3)

plyr を使い始めたばかり
ですが、これを実現するための plyr のみの代替手段はあるのでしょうか?

4

3 に答える 3

4

少なくともこの状況では、これは同じ結果をもたらします

library(plyr)
dd5 <- ddply(dd,.(group),function(x) x[max(x$mass)<45,])

all(dd4==dd5)
[1] TRUE
于 2012-12-07T13:54:54.767 に答える
3

これは、エレガンスをコーディングするためのdata.tableソリューションです

library(data.table)
DT <- data.table(dd)

DT[,if(max(mass) < 45){.SD},by=group]
    group     mass
 1:     a 28.80426
 2:     a 31.31232
 3:     a 29.47599
 4:     a 30.35425
 5:     a 29.92833
 6:     c 40.11349
 7:     c 40.17431
 8:     c 39.94652
 9:     c 39.57524
10:     c 40.20791

おそらくもう少し複雑です

new <- (DT[,index := max(mass) < 45,by=group][force(index)])[,index:=NULL]
于 2012-12-09T22:40:22.943 に答える
2

あなたが具体的にplyr解決策を求めていることは承知していますが、マルチステップアプローチを含まないベース R でこれを行う別の方法も共有すると思いました。

dd[as.logical(ave(dd$mass, dd$group, FUN = function(x) max(x) < 45)), ]

この関数は通常、R でグループを扱うときに便利です。ここでは、論理ベクトルを作成し、" " 値aveのインデックスに基づいてサブセット化しました。TRUE

于 2012-12-07T15:19:18.923 に答える