为每个组设置前n行的数据框,并按变量排序

r group-by data.table plyr

7020 观看

6回复

43 作者的声誉

我想为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  

我在这里寻找订单,排序和其他解决方案,但找不到合适的解决方案来解决这个问题。我感谢您的帮助。

作者: karlos 的来源 发布者: 2011 年 5 月 20 日

回应 (6)


13

50591 作者的声誉

决定

一个解决方案使用ddply()fromplyr

require(plyr)
ddply(d1, "Gender", function(x) head(x[order(x$Age, decreasing = TRUE) , ], 2))
作者: Chase 发布者: 20.05.2011 06:05

1

1244 作者的声誉

我确信有更好的答案,但这是一种方法:

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)),]
作者: Manoel Galdino 发布者: 20.05.2011 06:08

6

5677 作者的声誉

使用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]
作者: Wojciech Sobala 发布者: 20.05.2011 06:34

0

31 作者的声誉

如果您只是想进行排序,那就更容易了:

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

然后你可以打电话:

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

将每个性别子组的前两个子集化。

作者: alphaG77 发布者: 25.09.2011 04:56

0

557 作者的声誉

如果您需要,例如前两位女性和前三位男性,我有一个建议:

library(plyr)
m<-d1[order(d1$Age, decreasing = TRUE) , ] 
h<-mapply(function(x,y) head(x,y), split(m$Age,m$Gender),y=c(2,3)) 
ldply (h, data.frame)

您只需要更改最终数据帧的名称。

作者: Liliana Pacheco 发布者: 05.01.2017 07:28

0

1 作者的声誉

d1 = d1[order(d1$Gender, -d1$Age),]  
d1 = d1[ave(d1$Age, d1$Gender, FUN = seq_along) <= 2, ]

有一个类似的问题,并发现这个方法真的很快用于具有150万条记录的data.frame

作者: enkay 发布者: 30.03.2019 10:54
32x32