создание нового столбца, содержащего выражение plotmath, с использованием `dplyr :: case_when` - PullRequest
0 голосов
/ 27 июня 2018

Я хотел бы создать новый столбец, содержащий выражения для построения графика, который позже я планирую использовать в другом месте в конвейере анализа.

Вот минимальный пример, который я попробовал. Например, здесь я пытаюсь создать новый столбец с именем label, который будет иметь другое выражение для графика в зависимости от значения столбца y.

Это не похоже на работу:

# loading needed libraries
library(tidyverse)

# creating a dataframe
df <- data.frame(x = c(1:10), y = c(rep("a", 5), rep("b", 5))) %>%
  tibble::as_data_frame(x = .)

# adding a new column with plotmath expression
df %>%
  dplyr::mutate(.data = .,
                label = dplyr::case_when(
                  y == "a" ~ paste(list(
                  "'This is'", "~alpha==", 1
                ), sep = ""),
                y == "b" ~ paste(list(
                  "'This is'", "~beta==", 2
                ), sep = "")))
#> Error in mutate_impl(.data, dots): Evaluation error: `y == "a" ~ paste(list("'This is'", "~alpha==", 1), sep = "")`, `y == "b" ~ paste(list("'This is'", "~beta==", 2), sep = "")` must be length 10 or one, not 3.

Создано в 2018-06-26 пакетом Представ (v0.2.0).

1 Ответ

0 голосов
/ 27 июня 2018

Сообщение об ошибке показывает, что каждый случай возвращает длину 3. Это потому, что когда вы paste() список, используя sep, вы получите вектор такой же длины, что и список, поэтому

paste(list(
              "'This is'", "~alpha==", 1
            ), sep = "")

возвращает вектор длины 3, а не 1 или 10, как требуется. Если вместо этого вы используете аргумент collapse paste(), вы получите вектор длины 1. В контексте:

df %>%
  dplyr::mutate(.data = .,
            label = dplyr::case_when(
              y == "a" ~ paste(list(
                "'This is'", "~alpha==", 1
              ), collapse = ""),
              y == "b" ~ paste(list(
                "'This is'", "~beta==", 2
              ), collapse = "")))
# A tibble: 10 x 3
#       x y     label             
#   <int> <fct> <chr>             
# 1     1 a     'This is'~alpha==1
# 2     2 a     'This is'~alpha==1
# 3     3 a     'This is'~alpha==1
# 4     4 a     'This is'~alpha==1
# 5     5 a     'This is'~alpha==1
# 6     6 b     'This is'~beta==2 
# 7     7 b     'This is'~beta==2 
# 8     8 b     'This is'~beta==2 
# 9     9 b     'This is'~beta==2 
#10    10 b     'This is'~beta==2
...