У меня есть скрипт, который позволяет пользователю выбирать столбец для обработки, вводя префикс имени столбца на консоли.В первом примере ниже показана типичная операция: подсчет количества появлений оценки.Входная таблица имеет два столбца: категория cat
и оценка ANT_tot
.Входные данные обрабатываются с помощью dplyr::count
и выдают выходную таблицу с двумя столбцами: значениями баллов ANT_tot
и числом вхождений каждого значения n
.
library(tidyverse)
df1 <- data.frame(cat = c(1,1,2,2,2,3,3,3,3,3),
ANT_tot = c(45,72,51,51,51,45,30,31,30,31))
df2 <- df1 %>% count(ANT_tot)
df2
# A tibble: 5 x 2
ANT_tot n
<dbl> <int>
1 30 2
2 31 2
3 45 2
4 51 3
5 72 1
В реальном скриптеПользователь идентифицирует столбец для обработки, вводя префикс, и этот префикс присваивается символу vec.В этом примере я опущу шаг ввода с консоли и просто инициализирую вектор score_name
.
score_name <- c('ANT')
Эта строка символов ANT
затем используется по всему сценарию, вставляя ее вместе с различными суффиксами для именования различных столбцов.
В других приложениях мне удалось использовать eval()
и as.name()
, чтобы заставить R обрабатывать вставленную вместе строку как имя столбца, например,
eval(as.name(paste0(score_name, '_tot')))
В этих других случаях выражение оценивается как имя столбца ANT_tot
, и R можетобработайте его как переменную.
Тем не менее, он создает проблемный вывод в приведенном выше примере dplyr::count
:
df3 <- df1 %>% count(eval(as.name(paste0(score_name, '_tot'))))
df3
# A tibble: 5 x 2
`eval(as.name(paste0(score_name, "_tot")))` n
<dbl> <int>
1 30 2
2 31 2
3 45 2
4 51 3
5 72 1
Вместо простой передачи ранее существующего имени столбца ANT_tot
, он переименовывает столбец со всем выражением eval()
, бросая гаечный ключ в процессах последующей обработки.
Я озадачен тем, почему это происходит, потому что это же выражение дает ожидаемые результаты при использовании внутридругих функций (например, mean()
).
Возможно, что-то своеобразное в том, как оценка работает с count()
?Или проблема с цитатой?
Заранее спасибо за любую помощь!