1

我可以选择并排列一列:

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可能不是我想要的,但我现在遇到的主要问题是如何使用labelforloop 将接受它。

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

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

4

1 回答 1

2

如果你想在所有列上使用某些东西,有多种方法。我喜欢先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)

这会给你你在哪里寻找的东西吗?

于 2017-07-31T13:59:55.153 回答