我正在尝试使用mapply
迭代绘制散点图。
假设我有iris
数据集:
> names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length"
[4] "Petal.Width" "Species"
我想使用mapply()
而mapply()
来Sepal.Width
,Petal.Length
和Petal.Width
对Sepal.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轴值的列名,但这不起作用。
答案 0 :(得分:1)
mapply
和lapply
都没有将其数据对象中的项目名称传递给"工作函数"。功能完成后您看到的是他们将名称添加回结果。即使您使用了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)