我一直在阅读使用 dplyr 进行编程,并尝试将它描述的想法应用到我的工作中。我有一些有用的东西,但我不清楚我是否以“正确”的方式完成了它。我可以做一些更优雅或更简洁的事情吗?
我有一个tibble
where 行是场景,列与在该场景中运行的测试相关。有两种类型的列,一种是存储在该场景中计算的测试统计量,另一种是存储该测试的自由度。
所以,这是我拥有的数据类型的一个小玩具示例:
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))
}