2014-10-08 55 views
2

我有一個我想使用產生的各種特徵密度直方圖數據集中的以下功能:ggplot找不到數據幀傳遞給函數

fraudSplitHist <- function(dataframe, stat_col, signal_col='fraud') { 
    hist_data <- dataframe[,c(stat_col, signal_col)] 
    colnames(hist_data) <- c('stat', 'fraud') 

    hist_data$stat <- winsor1(hist_data$stat) # remove outliers 

    ggplot(hist_data, aes(hist_data$stat, fill=as.factor(hist_data$fraud))) + 
    geom_histogram(alpha=0.5, aes(y=..density..), position='identity', binwidth=1) 
} 

運行它總是給我這個錯誤

fraudSplitHist(dataframe=data, stat_col='some_column_of_values') 
Error in eval(expr, envir, enclos) : object 'hist_data' not found 

但是,它的工作原理與qplot

fraudSplitHist <- function(dataframe, stat_col, fraud_col='fraud') { 
    hist_data <- dataframe[,c(stat_col, fraud_col)] 
    colnames(hist_data) <- c('stat', 'fraud') 

    hist_data$stat <- winsor1(hist_data$stat) 

    qplot(data=hist_data, x=stat, geom="histogram", fill=as.factor(fraud), binwidth=10, 
     position='identity') 
} 

任何想法我可能是米西在這裏?

+2

類似這樣的問題是很容易回答,如果你確實提供了[重複的例子(http://stackoverflow.com/questions/5963269/how-to-make-a-再現性好的例子)完整的樣本數據,所以我們可以複製/粘貼到R並重新創建問題。 – MrFlick 2014-10-08 19:43:18

+5

您永遠不應該使用'$'來選擇'aes()'中的列。見'?aes_string'。 – joran 2014-10-08 19:44:18

回答

3

您不應在您的aes()設置中指定data.frame名稱。您應該只使用data.frame中的列名稱。例如,這應該工作

simpletest <- function(dataframe, x_col, y_col='cyl') { 
    plot_data <- dataframe[,c(x_col, y_col)] 
    colnames(plot_data) <- c('stat', 'fraud') 

    ggplot(plot_data, aes(stat, fill=as.factor(fraud))) + 
    geom_histogram(alpha=0.5, aes(y=..density..), position='identity', binwidth=1) 
} 

simpletest(mtcars, "disp")