【问题标题】:apply function and top_n doesn't work well togetherapply 函数和 top_n 不能很好地协同工作
【发布时间】:2020-06-02 21:37:11
【问题描述】:

我在 R 中有一个简单的数据框 df

year, var1, var2, var3
1990, 23, 1, 133
1991, 25, 3, 120
1992, 28, 2, 110
...

数据持续数百行。

我想在 R 中使用 apply()top_n() 为 var1、var2、var3 选择前 10 个值,如下所示:

df %>%
 select(var1, var2, var3) %>%
 apply(2, top_n(10), na.rm = TRUE)

但我得到了错误: Error in UseMethod("tbl_vars"): no applicable method for "tbl_vars" applied to an object of class "c('double', 'numeric')"

我认为apply 可以帮助我避免使用 for 循环逐个变量地获取前 10 个值,但我无法这样做。

这似乎是一个简单的问题,但我在网上没有找到好的答案。有什么想法吗?

【问题讨论】:

    标签: r dplyr apply


    【解决方案1】:

    top_n 需要一个 data.frame 作为输入,而当我们使用 applyMARGIN = 2 进行循环时,它会遍历每一列,即 vector

    library(purrr)
    library(dplyr)
    map_dfc(c('var1', 'var2', 'var3'), ~ df %>%
                                     select(.x) %>%
                                     top_n(10) %>%
                                      slice(seq_len(10)))
    

    另外,根据?top_n,被slice_max/slice_min取代

    map(c('var1', 'var2', 'var3'), ~ df %>%
                                     select(.x) %>%
                                     slice_max(!! rlang::sym(.x), n = 10)) 
    

    使用iris 的可重现示例

    map_dfc(names(iris)[1:4], ~
              iris %>% 
                  select(.x) %>% 
                  top_n(10) %>% 
                  slice(seq_len(10)))
    
    map(names(iris)[1:4], ~
              iris %>% 
                  select(.x) %>% 
                  slice_max(!! rlang::sym(.x), n = 10))
    

    或者summariseacrosssort

    library(tidyr)
    df %>%
         summarise(across(starts_with('var'), ~ 
           list(head(sort(., decreasing = TRUE), 10)))) %>%
         unnest(c(everything())
    

    【讨论】:

      【解决方案2】:

      通常,最好有长格式的数据,这样可以很容易地进行此类操作。

      您可以使用pivot_longer 获取长格式数据,然后对于每一列,您可以根据列中的值选择前 10 个值。

      library(dplyr)
      df %>% tidyr::pivot_longer(cols = -year) %>% group_by(name) %>%  top_n(10, value)
      

      【讨论】:

        猜你喜欢
        • 2016-12-08
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-14
        • 2018-01-18
        • 1970-01-01
        • 2018-12-25
        相关资源
        最近更新 更多