我的玩具数据框:
d <- data.frame(
value = sample(1:10),
class = sample(c("a","b"), 20, replace = TRUE)
)
我将数据框拆分为&#39; class&#39;并将它们放在一个列表中,每个列表元素在其类之后命名:
l <- dlply(d, .(class), function(x)return(x))
然后我想对每个班级进行补贴并制作直方图。请注意,我不想要一个方面。我希望将多个单独的文件保存为类。所以我定义了一个制作直方图的函数doPlots,然后对它们进行ggsaves(在本例中为a_hist.png和b_hist.png):
doPlots <- function(d, name){
g <- ggplot(data = d, aes(x=value)) +
geom_histogram(binwidth=1)
ggsave(filename=paste(name,"hist.png",sep="_"))
}
然而,当我屈服时:
lapply(l, FUN=doPlots, name=names(l))
我收到错误:device
必须为NULL,字符串或函数。
提前致谢。
答案 0 :(得分:1)
您的代码存在两个问题,一个是您将整个名称向量传递给函数。其次,您尚未添加要保存到ggsave
功能的图表。您可以使用mapply
迭代两个或多个列表。
doPlots <- function(d, name){
g <- ggplot(data = d, aes(x=value)) +
geom_histogram(binwidth=1)
ggsave(filename=paste(name, "hist.png", sep="_"), g)
}
mapply(doPlots, l, names(l))
答案 1 :(得分:0)
考虑基数R by
,它将数据帧按因子级别切分为元素列表。您甚至可以在一次通话中将用户定义的功能全部传递到其中:
dlist <- by(d, d$class, FUN=function(i) {
name <- max(as.character(i$class))
doPlots(i, name)
})