2017-06-02 142 views
0

我的玩具數據框:lapply當兩個列表元素的名稱是函數的參數

d <- data.frame(
    value = sample(1:10), 
    class = sample(c("a","b"), 20, replace = TRUE) 
) 

我拆我的數據由「類」的價值框架並把它們放在一個列表,其中每個列表元素被命名爲在它的課後:

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:

lapply(l, FUN=doPlots, name=names(l)) 

我得到錯誤:device必須爲NULL,字符串或函數。

在此先感謝。

+0

嘗試'lapply(l,function(x)doPlots(x,names(x)))''。你的'names(l)'是列表'l'名稱的整個向量,而不是每次迭代所需的名稱。 –

+0

這是有道理的(謝謝!)但我仍然得到相同的錯誤:( – VaguelySteamy

回答

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)) 
+0

默認爲ggsave使用最後一個情節,所以這部分是沒有必要的,我相信,但謝謝你,使用工作。 – VaguelySteamy

0

考慮基準R的by,它將一個數據幀按因子級別分成一列元素。您甚至可以在一次調用中將您的用戶定義函數全部傳遞給它:

dlist <- by(d, d$class, FUN=function(i) {  
      name <- max(as.character(i$class)) 
      doPlots(i, name)  
     }) 
相關問題