Я некоторое время боролся с реализацией https://dplyr.tidyverse.org/articles/programming.html Хэдли, и я не могу заставить ее работать в моих целях.
В моем игрушечном примере я хочу написать функцию, которая будет принимать в качестве аргументов два столбца (имена столбцов известны) и запускать t.test. Проблема в том, что я не могу передать имена столбцов в t.test. Вот оно:
df <- tibble(
names = LETTERS[1:10],
colA = rnorm(10),
colB = rnorm(10, 1, 2),
colC = rnorm(10, 3, 4)
)
И это то, что я имею в виду (обратите внимание, что я использую magrittr для извлечения столбцов как векторов напрямую):
myFun <- function(data, column_name1, column_name2) {
data %$%
t.test(column_name1, column_name2)$p.value
}
myFun(df, colA, colB) # doesn't work
Руководство Хэдли говорит, что проанализируйте имена столбцов должным образом, нам нужно использовать quosure, чтобы «заключить в кавычки» имена переменных, а затем «снять их в кавычки», когда они используются в функции (он использует слова «dark magi c», что звучит для меня точно). Я интерпретировал это так:
myFun <- function(data, column_name1, column_name2) {
col1 <- enquo(column_name1)
col2 <- enquo(column_name2)
data %$%
t.test(!!col1, !!col2)$p.value
}
myFun(df, colA, colB)
Это, однако, приводит к ошибке:
Error: Quosures can only be unquoted within a quasiquotation context.
# Bad:
list(!!myquosure)
# Good:
dplyr::mutate(data, !!myquosure)
Что, я думаю, означает, что я не могу использовать quosure с t.test (не функция Tidyverse)? Поэтому я пока отказался от своего t.test и попытался проверить, сработал ли просто выбор столбцов:
myFun <- function(data, column_name1, column_name2) {
col1 <- enquo(column_name1)
col2 <- enquo(column_name2)
data %>%
dplyr::select(!!col1, !!col2)
}
myFun(df, colA, colB)
Это работает. Но тогда это:
myFun <- function(data, column_name1, column_name2) {
col1 <- enquo(column_name1)
col2 <- enquo(column_name2)
data %>%
dplyr::select(!!col1, !!col2) %$%
t.test(col1, col2)$p.value
}
myFun(df, colA, colB)
- нет, с ошибкой Error in t.test.formula(colA, colB) : 'formula' missing or incorrect
(хотя я не использую обозначение формулы для t.test). Просто чтобы быть ясно, это работает нормально: df %$% t.test(colA, colB)$p.value
.
Я хотел бы понять, почему передача имен столбцов (которые выбраны правильно!) Не работает в этой функции и, если это безнадежно идея запустить попарно t.tests, что является лучшим решением? Конечной целью этого является более крупная функция, которая будет принимать произвольный набор числовых столбцов и выполнять все попарные t.test возможные.
Спасибо!
кДж