我有几个项目的群集数据,这些项目也有与之关联的排名。群集和排名数据框如下所示:
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循环来做这个,但必须有一个更好的方法。建议表示赞赏。
答案 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)
还可以尝试tapply
或aggregate
(虽然这些不会保留行名...)
with(df, tapply(rank, clus, head, 1))
或者
aggregate(rank ~ clus, df, head, 1)