我可以选择并安排一个专栏:
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))
不起作用。我四处搜索并尝试UQ
和substitute
之类的内容来取消引用label
,但没有结果。
rbind(top)
和top_n
结尾可能也不是我想要的,但我现在遇到的主要问题是如何使用label
以便forloop接受它。
也许有人比我的forloop知道一个更好的方法...
所需的输出是一个数据帧,每列的前3位。
答案 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
那能帮到你找到你想要的东西吗?