如何获取多列的toplists
How to get toplists of multiple columns
我可以select并排列一个列:
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 个。
如果你想在所有列上使用某些东西,有多种方法。我喜欢先 gather
(或熔化)数据,然后再次使用 dplyr。
例如,在您的情况下,这将导致
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
你看到的是 top_n
选择前 n 个值而不是前 n 个条目,但你可以用函数替换 slice(1:3)
这能满足您的需求吗?
我可以select并排列一个列:
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 个。
如果你想在所有列上使用某些东西,有多种方法。我喜欢先 gather
(或熔化)数据,然后再次使用 dplyr。
例如,在您的情况下,这将导致
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
你看到的是 top_n
选择前 n 个值而不是前 n 个条目,但你可以用函数替换 slice(1:3)
这能满足您的需求吗?