R - Как включить символы / уравнения в имена переменных фрейма данных? - PullRequest
0 голосов
/ 04 сентября 2018

Допустим, у меня есть tibble фрейм данных с именем df в R, например:

df <- tibble(a = 1:3, 
             b = c("a", "b", "c"))

Довольно просто переименовать переменные с помощью dplyr::rename() (или создать новые с помощью dplyr::mutate()), в том числе без кавычек с оператором :=, например ::

df <- df %>% 
    rename("the new b" := b) %>%
    mutate(c = a + 1)

Что дает мне:

> df
# A tibble: 3 x 3
      a `the new b`     c
  <int> <chr>       <dbl>
1     1 a               2
2     2 b               3
3     3 c               4

Однако, когда я хочу включить математические символы или уравнения в имена переменных с помощью expression(), это не работает, например, когда я пытаюсь использовать греческий альфа-символ, происходит сбой:

# Fails:
> df <- df %>% 
+     mutate(expression(A~symbol:~alpha) = c)
Error: unexpected '=' in:
"df <- df %>% 
    mutate(expression(A~symbol:~alpha) ="

# Fails again:
> df <- df %>% 
+     mutate(expression(A~symbol:~alpha) := c)
Error: The LHS of `:=` must be a string or a symbol

РЕДАКТИРОВАНИЕ / ОБНОВЛЕНИЕ : Для ясности, в приведенном выше примере я хочу получить действительный греческий буквенный символ ( не строка букв алфавита "alpha").

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ : Вот сложный пример. Что делать, если я хочу что-то вроде в качестве имени переменной :

complex math equation with big sigma and division

Возможные варианты использования для сложного примера относятся к меткам facet при построении с помощью ggplot2::facet_wrap() или при визуализации фрейма данных в виде таблицы с rmarkdown и т. Д. *

Я пытался вложить expression() в paste() или str_c() безрезультатно. Как мне этого добиться? Спасибо.

1 Ответ

0 голосов
/ 04 сентября 2018

Мы можем преобразовать его в символ или символ и затем выполнить := после вычисления (!!)

df %>% 
   mutate(!! as.character(expr) := c)
# A tibble: 3 x 4
#      a `the new b`     c `A ~ symbol:~alpha`
#  <int> <chr>       <dbl>               <dbl>
#1     1 a               2                   2
#2     2 b               3                   3
#3     3 c               4                   4

, где

expr <- expression(A ~ symbol:~ alpha)

Если нам нужна греческая буква (как прокомментировал @hpy), используйте символ юникода - для альфы это \u03B1

df %>% 
    mutate(!! "\u03B1" := c)
# A tibble: 3 x 4
#      a `the new b`     c     α
#  <int> <chr>       <dbl> <dbl>
#1     1 a               2     2
#2     2 b               3     3
#3     3 c               4     4

Вышеприведенное также может быть расширено до некоторых выражений

df %>% 
  mutate(!! paste0("\u03B1", "+", "\u03C1") := c)
# A tibble: 3 x 4
#      a `the new b`     c `α+ρ`
#   <int> <chr>       <dbl> <dbl>
#1     1 a               2     2
#2     2 b               3     3
#3     3 c               4     4
...