Принудительно R для оценки строки в качестве имени столбца - PullRequest
0 голосов
/ 15 июня 2019

У меня есть скрипт, который позволяет пользователю выбирать столбец для обработки, вводя префикс имени столбца на консоли.В первом примере ниже показана типичная операция: подсчет количества появлений оценки.Входная таблица имеет два столбца: категория 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()?Или проблема с цитатой?

Заранее спасибо за любую помощь!

...