如何在数据框中抓取双排列的第一个实例?

时间:2015-01-17 19:20:32

标签: r sorting

我有几个项目的群集数据,这些项目也有与之关联的排名。群集和排名数据框如下所示:

   clus   rank
A    1    1
B    1    3
C    1    5
D    2    4
E    2    6
F    3    9
G    3    8
H    3    7

我想只抓取每个群集中的第一个名称和排名,但只抓住每个群集中的那个项目,以便我得到:

A    1
D    4
F    9

我可以用一些for循环来做这个,但必须有一个更好的方法。建议表示赞赏。

3 个答案:

答案 0 :(得分:5)

你可以这样做:

df[!duplicated(df$clus), "rank", drop = FALSE]
#  rank
#A    1
#D    4
#F    9
如果您想保留所有列,请

df[!duplicated(df$clus),]

当然,dplyr和data.table也可以采用相同的方法。

答案 1 :(得分:3)

使用dplyr

library(dplyr)
df %>% 
   group_by(clus) %>% 
   slice(1)

library(data.table)
setDT(df)[, head(.SD, 1L), clus]

仅输出" rank"柱

setDT(df)[, list(rank=rank[1L]), clus][,clus:=NULL][]

如果您需要保留行名称

 df[with(df, ave(seq_along(clus), clus,
              FUN=seq_along)==1),'rank', drop=FALSE]

答案 2 :(得分:3)

还可以尝试tapplyaggregate(虽然这些不会保留行名...)

with(df, tapply(rank, clus, head, 1))

或者

aggregate(rank ~ clus, df, head, 1)