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
4

1 に答える 1

2

名前を使用する関数を作成する必要があります。そうしないと、関数内で名前にアクセスできなくなります。

に渡すことができないx = NULLのでplot、関数を少し書き直しました(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)

この関数は位置のインデックス付けでも機能することに注意してください(ただし、ラベルはそれほどきれいではありません)

于 2013-03-26T00:04:43.787 に答える