【问题标题】:How to get toplists of multiple columns如何获取多列的顶级列表
【发布时间】:2017-07-31 13:43:30
【问题描述】:

我可以选择并排列单个列:

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 个。

【问题讨论】:

    标签: r dplyr tidyverse rlang


    【解决方案1】:

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

    这能满足您的需求吗?

    【讨论】:

    • 很好的答案。小补充:如果使用slice(1:3)选择每组的前3个条目,结果可以进一步通过spread将data.frame恢复为原始宽格式。
    • 很高兴你喜欢它。要再次传播这些值,我们必须携带某种标识符,否则传播将停止,因为我们有重复的标识符......但否则你是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多