【问题标题】:Writing a custom dplyr function that sorts each tibble in a list in descending order [duplicate]编写一个自定义 dplyr 函数,按降序对列表中的每个小标题进行排序[重复]
【发布时间】:2020-08-27 02:33:32
【问题描述】:

这里是相当新的 R 用户,我目前正在学习 Dataquest.io 的 R 课程数据分析师,特别是在 NYC School Perception Guided Project 上工作。我正在尝试编写一个自定义函数,将两列子集到一个小标题中,并按相关系数降序对每个小标题进行排序。该函数对预期列进行子集化没有问题,但它从不按相关系数降序对小标题进行排序。我真的很想让每个小标题按降序排列,这样我就可以看到哪些相关对在顶行中具有最高的系数。

你可以在my GitHub page上下载我目前拥有的相关数据。

我编写了一个自定义函数来对 tibbles 进行子集化并按降序排列,然后将其映射到我创建的两个字符向量,最终生成一个包含 16 个 tibbles 的列表:

cor_func <- function(x,y) {
  cor_select %>% 
    dplyr::select(x,y) %>%
    dplyr::arrange(desc(y))
}

x_var <- names(cor_select)[1]
y_var <- names(cor_select)[c(6, 11, 13:26)]

cor_rank <- map2(x_var, y_var, cor_func)

当我从结果列表中索引其中一个小标题时,比如cor_rank[1],我得到一个未排序的小标题:

[[1]]
# A tibble: 16 x 2
   variable   avg_sat_score
   <chr>              <dbl>
 1 saf_p_11          0.113 
 2 com_p_11         -0.0909
 3 eng_p_11          0.0314
 4 aca_p_11          0.0330
 5 saf_t_11          0.303 
 6 com_t_11          0.0937
 7 eng_t_11          0.0488
 8 aca_t_11          0.137 
 9 saf_s_11          0.272 
10 com_s_11          0.163 
11 eng_s_11          0.167 
12 aca_s_11          0.286 
13 saf_tot_11        0.280 
14 com_tot_11        0.0881
15 eng_tot_11        0.0956
16 aca_tot_11        0.177 

我尝试将group_by 添加到函数中,删除dplyr::,以及其他几个没有结果或错误的故障排除选项。我对涉及不同包或完全从数据创建不同对象的其他解决方案持开放态度。这也是我在数小时未找到确切解决方案后发布的第二个堆栈溢出问题,如果有任何可重现性问题,请致歉。

【问题讨论】:

    标签: r sorting dplyr purrr


    【解决方案1】:

    在函数中使用变量时,您必须处理非标准评估 (NSE),因为 x_vary_var 是字符值,而 R 不知道这些应该被视为列。

    此外,由于x_var 只有一个值,您不需要在map2 中对其进行迭代,而是可以将其作为常量参数传递。试试看:

    library(dplyr)
    library(rlang)
    library(purrr)
    
    cor_func <- function(data, x, y) {
      data %>% 
        dplyr::select(x,y) %>%
        dplyr::arrange(desc(!!sym(y)))
    }
    
    cor_rank <- map(y_var, cor_func, data = cor_select, x = x_var)
    cor_rank[[1]]
    
    #    X SAT.Writing.Avg..Score
    #1   5          0.28334515007
    #2  12          0.27857524686
    #3  13          0.26180042755
    #4   9          0.24290539391
    #5  16          0.17148497238
    #6  10          0.15362911663
    #7  11          0.14843858472
    #8   8          0.12535108907
    #9   1          0.11940609104
    #10  6          0.09354663114
    #11 14          0.09043009320
    #12 15          0.08937188222
    #13  3          0.04655940169
    #14  7          0.04275641551
    #15  4          0.04050495122
    #16  2         -0.07174707738
    

    【讨论】:

    • 谢谢你,Ronak - 这很棒!感谢您的反馈。
    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2014-05-28
    • 2020-04-02
    • 2011-11-16
    • 2020-07-18
    相关资源
    最近更新 更多