8

変数でグループ化され、別の変数で降順にソートされている n 行のデータ フレームをサブセット化したいと思います。これは、次の例で明らかです。

    d1 <- data.frame(Gender = c("M", "M", "F", "F", "M", "M", "F", 
  "F"), Age = c(15, 38, 17, 35, 26, 24, 20, 26))

性別ごとに、年齢で降順に並べ替えられた2行を取得したいと思います。望ましい出力は次のとおりです。

Gender  Age  
F   35  
F   26  
M   38  
M   26  

ここで順序、並べ替え、およびその他の解決策を探しましたが、この問題に対する適切な解決策が見つかりませんでした。私はあなたの助けに感謝します。

4

6 に答える 6

13

ddply()fromを使用した 1 つのソリューションplyr

require(plyr)
ddply(d1, "Gender", function(x) head(x[order(x$Age, decreasing = TRUE) , ], 2))
于 2011-05-20T18:05:30.063 に答える
6

data.table パッケージを使用

require(data.table)
dt1<-data.table(d1)# to speedup you can add setkey(dt1,Gender)
dt1[,.SD[order(Age,decreasing=TRUE)[1:2]],by=Gender]
于 2011-05-20T18:34:56.787 に答える
1

より良い答えがあると確信していますが、ここに1つの方法があります:

require(plyr)
ddply(d1, c("Gender", "-Age"))[c(1:2, 5:6),-1]

ここで提供したものよりも大きなデータ フレームがあり、選択する行を視覚的に検査したくない場合は、次のようにします。

new.d1=ddply(d1, c("Gender", "-Age"))[,-1]
pos=match('M',new.d1$Gender) # pos wil show index of first entry of M
new.d1[c(1:2,pos:(pos+1)),]
于 2011-05-20T18:08:55.587 に答える
0

並べ替えだけを行いたい場合は、それよりもさらに簡単です。

d1 <- transform(d1[order(d1$Age, decreasing=TRUE), ], Gender=as.factor(Gender))

その後、次のように呼び出すことができます。

require(plyr)
d1 <- ddply(d1, .(Gender), head, n=2)

各性別サブグループの上位 2 つをサブセット化します。

于 2011-09-25T16:56:20.577 に答える