使用top_n创建新变量的dplyr方法

时间:2015-09-08 15:03:59

标签: r dplyr

我想创建一个查看top_n的变量,然后将1或2分配给一个新变量,该变量标识该元素是否在top_n中。我可以很容易地在基地R中做到这一点,但我似乎无法弄清楚如何做到这一点" dplyr"方式。

mtcars$car_name <- rownames(mtcars)
mtcars$new <- ifelse(
   mtcars$car_name %in% top_n(mtcars, 5, mpg)$car_name,
   1,2
)

你会如何改变这样做?

2 个答案:

答案 0 :(得分:3)

使用rank(或min_rank)来直接获取此内容可能会更简单(虽然成本稍高)。

mtcars %>% mutate(in_top_5 = (min_rank(-mpg) <= 5))

编辑:我撤回了“更昂贵”的评论 - 这与top_n使用的方法相同,因此效率也不低。

EDIT2:正如@DavidArenburg指出的那样,这不会给出与top_n相同的结果,首先是因为我使用了<而不是<=,其次,因为我使用了{{ 1}}而不是mpg。两者都已在上面修复。此外,在关系的情况下,这可能会超过5,但-mpg也是如此。

答案 1 :(得分:0)

虽然这里提供了一些非常好的解决方案,但另一个是:

-parallel

或者您可以创建自定义功能:

library(dplyr)
mtcars %>% arrange(-mpg) %>% mutate(top_5 = (cumsum(!is.na(mpg))<=5)*1)