使用 `dplyr::case_when` 创建一个包含 plotmath 表达式的新列
creating a new column containing plotmath expression using `dplyr::case_when`
我想创建一个包含 plotmath 表达式的新列,我稍后计划在分析管道的其他地方使用它。
这是我尝试过的一个最小示例。例如,我在这里尝试创建一个名为 label
的新列,该列将根据 y
列的值具有不同的 plotmath 表达式。
这似乎不起作用:
# 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.
由 reprex package (v0.2.0) 创建于 2018-06-26。
错误消息显示每个 case 都返回长度 3。这是因为当您 paste()
使用 sep
的列表时,您将获得与列表长度相同的向量, 所以
paste(list(
"'This is'", "~alpha==", 1
), sep = "")
returns 长度为 3 的向量,而不是所需的 1 或 10。相反,如果您使用 paste()
的 collapse
参数,您将得到一个长度为 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
我想创建一个包含 plotmath 表达式的新列,我稍后计划在分析管道的其他地方使用它。
这是我尝试过的一个最小示例。例如,我在这里尝试创建一个名为 label
的新列,该列将根据 y
列的值具有不同的 plotmath 表达式。
这似乎不起作用:
# 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.
由 reprex package (v0.2.0) 创建于 2018-06-26。
错误消息显示每个 case 都返回长度 3。这是因为当您 paste()
使用 sep
的列表时,您将获得与列表长度相同的向量, 所以
paste(list(
"'This is'", "~alpha==", 1
), sep = "")
returns 长度为 3 的向量,而不是所需的 1 或 10。相反,如果您使用 paste()
的 collapse
参数,您将得到一个长度为 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