我有一个数据框架 df
的例子(我们可以以 iris
.) 我还有虹膜的简单变换。
iris0 <- iris
iris1 <- cbind(log(iris[,1:4]),iris[5])
iris2 <- cbind(sqrt(iris[,1:4]),iris[5])
我想创建一个列表对象,其中包含了所有数字属性的密度分布。iris
,为这三个数据集中的每一个。所以,3个数据集中每个数据集共有4个属性:一个列表对象中有12个密度图)。我希望给定数据集的密度(对于每个属性)都是一种颜色,即颜色应该纯粹取决于数据集。只使用基础R,我认为Map是最好的方法。
datasets=c("iris0","iris1","iris2")
Map(function(.x, .y, df) {
ggplot(data = get(df), aes(x=.x)) +
geom_density(aes(fill=df)) + xlab(.y) + ggtitle(label=paste0(.y," Density in ",df," dataset"))}, df[names(df)], names(df), as.character(datasets) )
但这似乎遇到了一个错误。Error in get(df) : object 'df' not found
. 我还试着把 df[names(df)]
和 names(df)
与 get
围绕 df
但错误依然存在。
我还可以看到其他潜在的问题--我不确定。fill=df
将正确地将数据帧编码为一个因子,并确保它们每个都是一个独立的唯一颜色(但每个都保持所有属性的相同颜色)。
谁能帮忙解决这个问题?
(我想在不使用任何包的情况下,除了基础R+ggplot2和可能的dplyr外,还可以做到这一点)
而不是使用 Map
我利用的是 lapply
遍历 datasets
并在变量上通过 names(get(df))[1:4]
最后,我将列表扁平化,使用 Reduce
. 我还添加了一个自定义调色板,以填充密度图的数据集。试试这个。
iris0 <- iris
iris1 <- cbind(log(iris[,1:4]),iris[5])
iris2 <- cbind(sqrt(iris[,1:4]),iris[5])
datasets <- c("iris0","iris1","iris2")
palfill <- c("iris0" = "red","iris1" = "green","iris2" = "blue")
library(ggplot2)
# list of lists
plots <- lapply(datasets, function(df) {
lapply(names(get(df))[1:4], function(.x) {
ggplot(data = get(df), aes_string(x = .x)) +
geom_density(aes(fill = df)) +
scale_fill_manual(values = palfill) +
xlab(.x) +
ggtitle(label = paste0(.x, " Density in ", df," dataset"))
})
})
# flatten
plots <- Reduce(c, plots)
plots[[1]]
创建于2020-05-16,作者: 重读包 (v0.3.0)