使用mapply绘图

时间:2018-02-18 03:27:30

标签: r mapply

我正在尝试使用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轴值的列名,但这不起作用。

2 个答案:

答案 0 :(得分:1)

mapplylapply都没有将其数据对象中的项目名称传递给"工作函数"。功能完成后您看到的是他们将名称添加回结果。即使您使用了deparse(替代)策略,您最终也会得到一个无用的名称,例如" dots [[1L]] [[1L]]"。因此,您可能会被名称本身或数字索引索引到names(dataframe)值。

答案 1 :(得分:1)

考虑传递列名以适合您的列分配和 ylab 字符要求。正如@alistaire评论,你只是将一个向量传递给你的函数。 Mapply(非正式地称为 m ultivariate 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)