2017-05-06 14 views
0

見つける:集約と私は、データフレームの下に持っている最大値

df1 <- data.frame(city =c("c1","c2","c3","c2","c1","c2"),people =c(1000,234,678,45,11,100)) 

私はC1、C2、C3の人々の総数を見つけて、最大の人口を選択しようとします。私は以下のコードを書いた:

aggregate(city~people, df1, FUN = function(x) length(unique(x))) 

私の目標を達成するためにこのコードを完成させることができます。

は:私の結果は

c1: 1011 
c2: 379 

は大都市いるようなものです。)あなたは、出力形式のわずかな違いを気にしない場合

+0

を望んでいた場合は、 '集計(人々は〜都市を意味しました'' library(data.table) '''' setDT(df1)[、.SD [which.max(people)]、city] ''ライブラリ(data.table) '' – akrun

+0

グループ出力変数「人」であるグループごとに1回しか観測しないコード – akrun

+0

@akrun:city1の結果は1011でなければならず、city2は379でなければならず、cityは678で、最大の都市はcity1とcity2です。しかし、これは集計が私に結果を与えることはありません。 – Beh

答えて

1

tapplyが集計よりも効率的であることをget、arrayはdata.frameと反対です。 、

microbenchmark::microbenchmark(tapply(df1$people, df1$city, sum), aggregate(people~city, df1, sum)) 
Unit: microseconds 
           expr  min  lq  mean median  uq  max neval 
    tapply(df1$people, df1$city, sum) 48.283 60.2675 86.4515 68.0010 107.416 258.671 100 
aggregate(people ~ city, df1, sum) 690.907 715.2445 1012.9741 770.7325 1268.336 3853.902 100 

このコードは、それぞれあなた

sum_by_city <- tapply(df1$people, df1$city, sum) 
names(which.max(sum_by_city)) 
names(which.min(sum_by_city)) 

を最大値と最小値の合計と都市名を与えるそれとも、トップ2

names(sort(sum_by_city, decreasing = TRUE)[1:2]) 
+0

最大の人口を持つ2つの都市を選択したい場合はどうすればいいですか? – Beh

+0

@Beh上記の編集を参照してください – Gladwell

+0

ありがとうございます私のデータフレームは次のようになります:df1 < - data.frame(company = c( "c1"、 "c2"、 "c3"、 "c2"、 "c1 "、" C "、" C ")フィールド= c(" A "、" B "、" C "、" A "、" D "、" C "))私は、各企業について、いくつのフィールドを見つけて、各フィールドのトップ2企業を選ぶことができるかを見たいと思っています。 – Beh

関連する問題