为了账号安全,请及时绑定邮箱和手机立即绑定

按组选择前N个值

/ 猿问

按组选择前N个值

Cats萌萌 2019-11-14 15:21:46

这是对r-help邮件列表上询问的问题的答复。


这里有很多示例,这些示例如何通过分组使用来查找最高值sql,因此我想可以很容易地使用R sqldf包将这些知识转换为知识。


例如:mtcars按分组时cyl,这是的每个不同值的前三条记录cyl。请注意,在这种情况下,不包括领带,但是最好显示一些其他处理领带的方法。


                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb ranks

Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1   2.0

Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2   1.0

Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1   2.0

Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4   3.0

Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4   1.0

Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4   1.5

Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4   1.5

Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4   3.0

如何找到每组的前N个记录(最大或最小)?


查看完整描述

3 回答

?
翻阅古今

使用data.table它似乎更直接,因为它在设置键时执行排序。


因此,如果我要获得排序前3个记录(升序),那么,


require(data.table)

d <- data.table(mtcars, key="cyl")

d[, head(.SD, 3), by=cyl]

可以。


如果你想降序


d[, tail(.SD, 3), by=cyl] # Thanks @MatthewDowle

编辑:使用列来整理关系mpg:


d <- data.table(mtcars, key="cyl")

d.out <- d[, .SD[mpg %in% head(sort(unique(mpg)), 3)], by=cyl]


#     cyl  mpg  disp  hp drat    wt  qsec vs am gear carb rank

#  1:   4 22.8 108.0  93 3.85 2.320 18.61  1  1    4    1   11

#  2:   4 22.8 140.8  95 3.92 3.150 22.90  1  0    4    2    1

#  3:   4 21.5 120.1  97 3.70 2.465 20.01  1  0    3    1    8

#  4:   4 21.4 121.0 109 4.11 2.780 18.60  1  1    4    2    6

#  5:   6 18.1 225.0 105 2.76 3.460 20.22  1  0    3    1    7

#  6:   6 19.2 167.6 123 3.92 3.440 18.30  1  0    4    4    1

#  7:   6 17.8 167.6 123 3.92 3.440 18.90  1  0    4    4    2

#  8:   8 14.3 360.0 245 3.21 3.570 15.84  0  0    3    4    7

#  9:   8 10.4 472.0 205 2.93 5.250 17.98  0  0    3    4   14

# 10:   8 10.4 460.0 215 3.00 5.424 17.82  0  0    3    4    5

# 11:   8 13.3 350.0 245 3.73 3.840 15.41  0  0    3    4    3


# and for last N elements, of course it is straightforward

d.out <- d[, .SD[mpg %in% tail(sort(unique(mpg)), 3)], by=cyl]


查看完整回答
反对 回复 2019-11-14
?
烙印99

随便按什么排序(例如,mpg,问题尚不清楚)


mt <- mtcars[order(mtcars$mpg), ]

然后使用by函数获取每组中的前n行


d <- by(mt, mt["cyl"], head, n=4)

如果希望结果为data.frame:


Reduce(rbind, d)

编辑: 处理关系比较困难,但是如果需要所有关系:


by(mt, mt["cyl"], function(x) x[rank(x$mpg) %in% sort(unique(rank(x$mpg)))[1:4], ])

另一种方法是根据其他一些信息(例如,


mt <- mtcars[order(mtcars$mpg, mtcars$hp), ]

by(mt, mt["cyl"], head, n=4)


查看完整回答
反对 回复 2019-11-14
?
catspeake

dplyr 绝招


mtcars %>% 

arrange(desc(mpg)) %>% 

group_by(cyl) %>% slice(1:2)



 mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb

  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>

1  33.9     4  71.1    65  4.22 1.835 19.90     1     1     4     1

2  32.4     4  78.7    66  4.08 2.200 19.47     1     1     4     1

3  21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1

4  21.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4

5  19.2     8 400.0   175  3.08 3.845 17.05     0     0     3     2

6  18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 41 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信