1

我一直在阅读使用 dplyr 进行编程,并尝试将它描述的想法应用到我的工作中。我有一些有用的东西,但我不清楚我是否以“正确”的方式完成了它。我可以做一些更优雅或更简洁的事情吗?

我有一个tibblewhere 行是场景,列与在该场景中运行的测试相关。有两种类型的列,一种是存储在该场景中计算的测试统计量,另一种是存储该测试的自由度。

所以,这是我拥有的数据类型的一个小玩具示例:

library(tidyverse)
set.seed(27599)

my_tbl <- data_frame(test1_stat = rnorm(12), test1_df = rep(x = c(1, 2, 3), times = 4), 
                     test2_stat = rnorm(12), test2_df = rep(x = c(1, 2, 3, 4), times = 3))

我想计算将基于 itsstat和 its的每个测试的摘要df。我的示例是我想计算stat每个组的中位数,其中组由df. 不能保证分组在测试中是相同的,甚至不能保证组的数量是相同的。

所以,这就是我所做的:

get_test_median = function(df, test_name) {

  stat_col_name <- paste0(test_name, '_stat')
  df_col_name <- paste0(test_name, '_df')
  median_col_name <- paste0(test_name, '_median')

  df %>%
    dplyr::group_by(rlang::UQ(rlang::sym(df_col_name))) %>%
    dplyr::summarise(rlang::UQ(median_col_name) := median(x = rlang::UQ(rlang::sym(stat_col_name)), na.rm = TRUE))
}

my_tbl %>% get_test_median(test_name = 'test1')
my_tbl %>% get_test_median(test_name = 'test2')

这行得通。但是,有经验的rlang用户会这样做吗?我是 NSE 的新手,对rlang重复使用两个嵌套函数(UQ(sym(.)))有点惊讶。

我很高兴使用UQ而不是!!,只是因为我更喜欢传统的函数符号。

根据评论,我摆脱了namespace::function符号,现在我的函数看起来并不那么冗长:

get_test_median = function(df, test_name) {

  stat_col_name <- paste0(test_name, '_stat')
  df_col_name <- paste0(test_name, '_df')
  median_col_name <- paste0(test_name, '_median')

  df %>%
    dplyr::group_by(UQ(sym(df_col_name))) %>%
    dplyr::summarise(UQ(median_col_name) := median(x = UQ(sym(stat_col_name)), na.rm = TRUE))
}
4

0 回答 0