【问题标题】:Using mapply to plot使用 mapply 进行绘图
【发布时间】:2018-02-18 03:27:30
【问题描述】:

我正在尝试仅使用mapply 迭代地绘制散点图。 假设我有iris 数据集:

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length"
[4] "Petal.Width"  "Species" 

我想使用 mapply() 并且仅使用 mapply() 来绘制 Sepal.WidthPetal.LengthPetal.WidthSepal.Length

我有这个入门代码:

    mapply(function(ii){plot(x = iris[["Sepal.Length"]],
           y = ii, ylab = paste(names(ii)), xlab = "Sepal Length")},
           ii = iris[c(2,3,4)])

这里一切正常,除了 y 轴标签。我希望它显示 y 轴值的列名,但这不起作用。

【问题讨论】:

  • 由于您只迭代一个变量,您可以使用lapply。一种方法是将公式粘贴在一起,所以lapply(paste(names(iris[2:4]), '~', names(iris)[1]), function(x) plot(as.formula(x), data = iris))

标签: r mapply


【解决方案1】:

考虑传递列名称以适应您的列分配和 ylab 字符要求。作为@alistaire cmets,您只需将一个向量传递给您的函数。 Mapply(非正式地称为 multivariate apply)旨在逐元素迭代多个等长或多长向量。这类似于传递 Sepal.Length 1 或 3 次:

plotfct <- function(ii, jj)
  plot(x = iris[[ii]], y = iris[[jj]], 
       xlab = paste(ii), ylab = paste(ii))

mapply(plotfct, c("Sepal.Length", "Sepal.Length", "Sepal.Length"), 
                c("Sepal.Width", "Petal.Length", "Petal.Width"))

但由于 Sepal.Length 不会改变,重复其值以满足更长的长度是多余的。只需使用lapply 或其简化的包装器sapply

plotfct <- function(ii)
  plot(x = iris[["Sepal.Length"]], y = iris[[ii]], 
       xlab = "Sepal Length", ylab = paste(ii))

lapply(c("Sepal.Width", "Petal.Length", "Petal.Width"), plotfct)

# EQUIVALENTLY:
# sapply(c("Sepal.Width", "Petal.Length", "Petal.Width"), plotfct)

【讨论】:

    【解决方案2】:

    mapplylapply 都不会将其数据对象中的项目名称传递给“工作函数”。您在函数完成后看到的是它们将名称添加回结果中。即使您使用 deparse(substitute)) 策略,您最终也会得到一个无用的名称,例如“dots[[1L]][[1L]]”。因此,您要么按名称本身进行索引,要么按数字索引对 names(dataframe) 值进行索引。

    【讨论】:

      猜你喜欢
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多