数据框中有两列,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)
答案 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
是数据表中的函数名。