自动将多项式转换为R中ggplot图例的表达式
我正在尝试将多项式变量字符串转换为R中的表达式,我已经看到了。然而,我正在努力概念化一种方法,它允许我提供一个变量列表,并开发一个字符串,该字符串对于自动将多项式转换为R中ggplot图例的表达式,r,ggplot2,R,Ggplot2,我正在尝试将多项式变量字符串转换为R中的表达式,我已经看到了。然而,我正在努力概念化一种方法,它允许我提供一个变量列表,并开发一个字符串,该字符串对于ggplot图例来说是正确的。例如,我有以下字符串: variable.names <- c("x", "y", "yy", "xxx", "xxy", "yyy", "x
ggplot
图例来说是正确的。例如,我有以下字符串:
variable.names <- c("x", "y", "yy", "xxx", "xxy", "yyy",
"xxxxx", "xxxxy", "xxxyy", "xxyyy", "yyyyy")
variable.namesvariable.names这里有一个整洁的解决方案,更新于2020-11-24T13:35:33,用于任何数量的变量,不包括^
和输出表达式:
purrr::map(strsplit(variable.names, ""), ~{
.str <- .x
.vars <- purrr::map(unique(.str), ~{
.instances <- sum(.str %in% .x)
if (.instances == 0) .v <- NULL else if (.instances == 1) .v <- .x else if (.instances > 1) .v <- paste0(.x,"^",.instances)
})
parse(text = paste0(.vars, collapse = "*"))
})
purrr::map(strsplit(variable.names,”)~{
.str变量名是如何创建的?您可以使用该过程来创建表达式吗?变量名是使用类似于strsplit
的方法创建的,它们是在多项式的初始展开过程中创建并重新排序的。下面提供的方法似乎可以按照我的要求工作。“多项式展开”我会首先从表达式中创建表达式,而不是变量名,反之亦然。我不喜欢解析的需要。扩展是基于R
中的polym
函数使用的。它根据结果列提供的数字生成变量名。这是保持c列的顺序是基于多项式次数而不是字母顺序。@Roland在tidy中有可能得到相同的结果吗?tidy解决方案面临的唯一问题是变量在图例中看起来不正确。例如,我不希望图例中有^
符号。所以您希望x2y2代表x^2y^2?@AW27我更新了您只需要更新输出行以给出一个表达式:rlang::parse_expr(do.call(paste0.vars))
,正如我在上面所做的那样。@AW27好的,您的第一条评论是>“我不希望图例中出现^
,因此我认为您不希望出现这种情况。它已更新,可为您提供表达式
调用
variable.names <- c("x", "y", "yy", "xxx", "xxy", "yyy",
"xxxxx", "xxxxy", "xxxyy", "xxyyy", "yyyyy")
foo <- function(x) {
runlength <- rle(x)
string <- gsub("^1", "",
paste0(paste(runlength$values,
runlength$lengths, sep = "^"),
collapse = "*"),
fixed = TRUE)
parse(text = string)
}
res <- lapply(strsplit(variable.names, ""), foo)
plot.new()
plot.window(c(0, 2), c(0, 11))
text(1, 10:0, do.call(c, res))
purrr::map(strsplit(variable.names, ""), ~{
.str <- .x
.vars <- purrr::map(unique(.str), ~{
.instances <- sum(.str %in% .x)
if (.instances == 0) .v <- NULL else if (.instances == 1) .v <- .x else if (.instances > 1) .v <- paste0(.x,"^",.instances)
})
parse(text = paste0(.vars, collapse = "*"))
})