我想创建一个查看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
)
你会如何改变这样做?
答案 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)