2013-03-25 54 views
2

我正在嘗試編寫一些將採用數據框並繪製每個數字列的東西,並對正常分佈的非正態分佈和控制圖進行簡單繪圖:將函數應用於名稱上的數據框中的每一列

library(plyr) 
library(qcc) 
library(ggplot2) 

#generate data frame 
data <- data.frame(seq_len(10),LETTERS[seq_len(10)],rnorm(10,5,3),rep(1,10),rep(2,10),rnorm(10,3,1),runif(10)) 

##checks heterogeneity 
has_range <- function(data) { if(all(abs(data - mean(data)) == 0)) FALSE else TRUE} 

##test for normality 
normtest <- function(data) {if(has_range(data) == FALSE) FALSE else { 
    if(shapiro.test(data)$p.value < 0.05) FALSE else TRUE}} 

##Control charts for Normal data, simple plots otherwise 
drawplot<-function(data, ref=NULL) { 
    Sys.sleep(.1) 
    print(names(data)) 
    if(normtest(data) == FALSE) { 
    plot(x=ref, y=data, ylab=names(data)) 
    } else { 
    qcc(data,type="xbar.one", labels=ref, ylab=names(data)) 
    } 
} 

## Apply drawplot to all numeric columns in data frame 
colwise(drawplot, is.numeric, ref=data[[2]])(data) 

的問題是,每一個申請家庭的功能似乎會列名,我不能使用列名來標記圖:

print(names(data)) 

給出NULL結果。

也有被裁剪了一個看似不相關的錯誤:

Error: length(rows) == 1 is not TRUE 

回答

2

你需要創建一個使用該名稱的功能,否則的名字將不會在函數內部訪問。

你不能傳遞到x = NULLplot,所以我改寫了一下你的函數 的(qcc被踢了大驚小怪用原子矢量x以及)

喜歡的東西

drawplot<-function(n, data, ref=NULL) { 
    Sys.sleep(.1) 
    print(n) 


    if(normtest(data[[n]]) == FALSE) { 
    if(is.null(ref)){ref <- seq_along(data[[n]])} 
    plot(x=ref, y=data[[n]], ylab=n) 
    } else { 
    qcc(data[,n, drop=FALSE], type="xbar.one", labels=ref,ylab = n) 
    } 
} 

lapply(names(Filter(is.numeric,dd)), drawplot, data = dd) 

請注意,此功能也可以與位置索引一起工作(但標籤不會太漂亮)

+0

感謝mnel,這似乎工作。只需要向任何人複製,您必須在此修改中將您創建的原始數據框命名爲'dd'。現在我要去查看圖表,看看我是否可以使用ggplot2而不是plot。另外,有一個基於ggplot2的qcc軟件包會很好。 – variable 2013-03-26 02:13:08

+0

@variable - 是的,我會重命名。我不喜歡'data'作爲變量名,因爲有一個'data'函數。 – mnel 2013-03-26 02:28:21

相關問題