Мой вопрос основан на подобном введении дополнительного ограничения, что имя каждой переменной должно появляться только один раз.
Рассмотрим фрейм данных
library( tidyverse )
df <- tibble( potentially_long_name_i_dont_want_to_type_twice = 1:10,
another_annoyingly_long_name = 21:30 )
Я хотел бы применить mean
к первому столбцу и sum
ко второму столбцу, без необходимости вводить имя каждого столбца дважды.
Как показывает вопрос, который я связал выше, summarize
позволяет вам сделать это, но требует, чтобы имя каждого столбца появлялось дважды. С другой стороны, summarize_at
позволяет вам кратко применять несколько функций к нескольким столбцам, но делает это, вызывая все указанные функции для всех указанных столбцов, вместо того, чтобы делать это в мода один на один. Есть ли способ объединить эти отличительные черты summarize
и summarize_at
?
Мне удалось взломать его с помощью rlang
, но я не уверен, что он чище, чем просто набирать каждую переменную дважды:
v <- c("potentially_long_name_i_dont_want_to_type_twice",
"another_annoyingly_long_name")
f <- list(mean,sum)
## Desired output
smrz <- set_names(v) %>% map(sym) %>% map2( f, ~rlang::call2(.y,.x) )
df %>% summarize( !!!smrz )
# # A tibble: 1 x 2
# potentially_long_name_i_dont_want_to_type_twice another_annoyingly_long_name
# <dbl> <int>
# 1 5.5 255
РЕДАКТИРОВАТЬ для решения некоторых философских вопросов
Я не думаю, что желать избегать идиомы x=f(x)
необоснованно. Я, вероятно, сталкивался с чрезмерным усердием при наборе длинных имен, но реальная проблема заключается в наличии (относительно) длинных имен, которые очень похожи друг на друга. Примеры включают нуклеотидные последовательности (например, AGCCAGCGGAAACAGTAAGG
) и штрих-коды TCGA . В таких случаях не только автоматическое заполнение ограниченной утилиты, но и написание таких вещей, как AGCCAGCGGAAACAGTAAGG = sum( AGCCAGCGGAAACAGTAAGG )
, вносит ненужную связь и увеличивает риск того, что две стороны назначения могут случайно не синхронизироваться при разработке и поддержке кода.
Я полностью согласен с @MrFlick в отношении dplyr
повышения читабельности кода, но я не думаю, что читаемость должна идти за счет правильности. Такие функции, как summarize_at
и mutate_at
, великолепны, поскольку они обеспечивают идеальный баланс между размещением операций рядом с их операндами (ясность) и гарантией того, что результат записан в правильный столбец (правильность).
К тому же, я чувствую, что предлагаемые решения, которые исключают упоминание переменных, в целом слишком сильно отклоняются в другом направлении. Несмотря на то, что они по своей сути умны - и я, безусловно, ценю дополнительную типизацию, которую они сохраняют, - я думаю, что, удаляя связь между функциями и именами переменных, такие решения теперь полагаются на правильное упорядочение переменных, что создает свои собственные риски случайных ошибок.
Короче говоря, я считаю, что операция самообращения / суммирования должна упоминать каждое имя переменной ровно один раз.