如何获得多列的顶级列表

时间:2017-07-31 13:43:31

标签: r dplyr tidyverse rlang

我可以选择并安排一个专栏:

iris %>%
  select(Petal.Width, Species) %>%
  arrange(desc(Petal.Width))

但是我想为整个数据帧做这件事。我用forloop接近这个:

features <- colnames(iris)
top <- data.frame()
for (i in 1:length(features)) {
  label <- features[[i]]
  iris %>%
    select(label, Species) %>%
    arrange(desc(label)) %>%
    top_n(3) %>%
    rbind(top)
}
# Error in arrange_impl(.data, dots) : 
# incorrect size (1) at position 1, expecting : 150

这给了我一个错误。

显然arrange(desc(label))不起作用。我四处搜索并尝试UQsubstitute之类的内容来取消引用label,但没有结果。

rbind(top)top_n结尾可能也不是我想要的,但我现在遇到的主要问题是如何使用label以便forloop接受它。

也许有人比我的forloop知道一个更好的方法...

所需的输出是一个数据帧,每列的前3位。

1 个答案:

答案 0 :(得分:2)

如果要在所有列上使用某些内容,则有多种方法。我喜欢先crop(或融化)数据,然后再次使用dplyr。

例如,在您的情况下,这将导致


gather

您看到library(tidyr) library(dplyr) iris %>% gather("var", "val", -Species) %>% group_by(var) %>% arrange(desc(val)) %>% top_n(3) #> Selecting by val #> # A tibble: 14 x 3 #> # Groups: var [4] #> Species var val #> <fctr> <chr> <dbl> #> 1 virginica Sepal.Length 7.9 #> 2 virginica Sepal.Length 7.7 #> 3 virginica Sepal.Length 7.7 #> 4 virginica Sepal.Length 7.7 #> 5 virginica Sepal.Length 7.7 #> 6 virginica Petal.Length 6.9 #> 7 virginica Petal.Length 6.7 #> 8 virginica Petal.Length 6.7 #> 9 setosa Sepal.Width 4.4 #> 10 setosa Sepal.Width 4.2 #> 11 setosa Sepal.Width 4.1 #> 12 virginica Petal.Width 2.5 #> 13 virginica Petal.Width 2.5 #> 14 virginica Petal.Width 2.5 选择前n个值而不是前n个条目,但您可以将函数替换为top_n

那能帮到你找到你想要的东西吗?