选择最好的,第二个和第三个

时间:2016-09-07 14:37:20

标签: r

数据框中有两列,rank,pet,在rank列中,最高等级为“1”,第二列为“2”,第三列为“10”。如何创建一个新的列b选择三种宠物中的最高等级。例如,在狗排中,我想选择第一排狗,在猫排中,我想选择第六排猫。

rank<-c(1,2,7,3,10,2,10,2,1)
pet <-c("dog","dog","dog","cat","cat","cat","bird","bird","bird")
a <-data.frame(rank,pet)

3 个答案:

答案 0 :(得分:2)

使用dplyr,您可以

library(dplyr)
a %>% group_by(pet) %>% top_n(1, -rank)

top_n函数允许您返回某些列的极值。我们按pet分组以获得每只宠物不同的分钟数。

或者如果你想要一个新专栏,你可以做

a %>% group_by(pet) %>% mutate(b=rank(rank)==1)

答案 1 :(得分:0)

a$id <- 1:length(a$pet)
a <- a[order(a$rank),]
a <- a[order(a$pet),]
b <- a[!(duplicated(a$pet)),]

我添加了一个ID列,因为否则您将不知道哪个宠物在最终结果中,然后按等级排序,然后按宠物排序,然后删除'重复'宠物,这些是排名靠前的宠物宠物。

注意,你说你正在寻找一个列b作为输出,但我不确定它是如何工作的,所以我给了一个数据框。如果您只想要一列id,则可以使用它来仅选择id列:

b <- a[!(duplicated(a$pet)),"id"]

答案 2 :(得分:0)

使用data.table对象进行快速简单的数据操作:

library(data.table)
rankk<-c(1,2,7,3,10,2,10,2,1)
pet <-c("dog","dog","dog","cat","cat","cat","bird","bird","bird")
a <-data.table(rankk,pet)
a[, b := min(rankk), by = pet]

我将“rank”重新定义为“rankk”,因为rank是数据表中的函数名。