使用动态列名在dplyr中按自定义顺序排序

7

我正在尝试根据某一列动态设置的变量名对tibble进行排序。

以下是目前我尝试的代码,但是出现了错误。第二个代码块可以正常工作(在其中我已经硬编码了我想要基于变量设置的符号列名)。

library(tidyverse)

group_var <- "symbol"

date_seq <- seq(as.Date("2000-01-01"), as.Date("2009-12-31"), by = "days")
test_tbl <- tibble::tibble("date" = rep(date_seq, 3),
                           "symbol" = rep(c("test3", "test1", "test2"), each = length(date_seq)),
                           "value" = c(rnorm(length(date_seq), sd = 0.05),
                                       rnorm(length(date_seq), sd = 0.05),
                                       rnorm(length(date_seq), sd = 0.05)))

order_var <- c("test1", "test2", "test3")
test_tbl_final <- test_tbl %>%
  dplyr::arrange(factor(!!group_var, levels = order_var), date)

以下是能够工作并展示我想要实现的代码:
library(tidyverse)

date_seq <- seq(as.Date("2000-01-01"), as.Date("2009-12-31"), by = "days")
test_tbl <- tibble::tibble("date" = rep(date_seq, 3),
                           "symbol" = rep(c("test3", "test1", "test2"), each = length(date_seq)),
                           "value" = c(rnorm(length(date_seq), sd = 0.05),
                                       rnorm(length(date_seq), sd = 0.05),
                                       rnorm(length(date_seq), sd = 0.05)))

order_var <- c("test1", "test2", "test3")
test_tbl_final <- test_tbl %>%
  dplyr::arrange(factor(symbol, levels = order_var), date)
2个回答

7
您还可以使用来自基础R的as.symbol
test_tbl_final <- test_tbl %>%
  dplyr::arrange(factor(!!as.symbol(group_var), levels = order_var), date)

谢谢,喜欢基本的R函数提及。 - Trevor Nederlof

3
您需要使用rlang:symgroup_var从字符symbol转换为一个符号symbol,然后使用!!将该符号作为列对象进行评估:
test_tbl %>% 
    arrange(factor(!!rlang::sym(group_var), levels = order_var), date)

# A tibble: 10,959 x 3
#         date symbol         value
#       <date>  <chr>         <dbl>
# 1 2000-01-01  test1  0.0519143671
# 2 2000-01-02  test1 -0.0464782439
# 3 2000-01-03  test1 -0.0295441613
# ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接