2017-05-06 65 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

难道你的意思是'总(人〜市, df1,max)'或 'setDT(df1)[,.SD [which.max(people)],city]''library(data.table)' – akrun

+0

您可以在编辑中显示您的预期输出,因为您的分组变量是'人'每组只有一个观察值的代码 – akrun

+0

@akrun:我在城市1中的结果应该是1011在城市2中应该是379,城市应该是678,最大的城市是城市1和城市2。但是这个聚合不会给我结果。 – 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 “,”c2“),field = c(”A“,”B“,”C“,”A“,”D“,”C“))我该怎么做同样的动作。我想看看每个公司,可以找到多少个领域,然后选择每个领域的前两名公司。 – Beh