2

ループを書いた経験があまりないので、すべての新しいデータセットで頻繁に行うことを (ループで) 自動化しようとしています: 各変数の箱ひげ図とヒストグラムを作成し、記述統計を計算します。 describe (Hmisc) および/または stats (fileds) の両方を使用します。

理想的には、ループが適切な変数ごとに 1 つの箱ひげ図を生成するようにしたいと考えています。以下の私のループは、ボックスプロットを 1 つだけ生成し、エラーを返します。

エラー: 戻る関数がありません。トップ レベルにジャンプします

私は何を間違えていますか?また、不十分なループ記述方法を正す可能性のあるリファレンス/ウェブサイトを誰かが教えてくれたら、助けてもらいたいです。

ありがとう!クリス

y <- LETTERS[as.integer(rnorm(100, mean=5, sd=1))]
z <- LETTERS[as.integer(rnorm(100, mean=10, sd=1))]
x <- round(rnorm(100, mean=5, sd=2.5),2)
data <- as.data.frame(cbind(x,y,z))


A<- do.call("cbind", lapply(data, class))
B<- as.vector( A[1,])
C <- grep("character|factor", B)

for (i in 1:length(C)) {
  x <- C[i]
  counti <- table(data[,x])
  y <- barplot(counti, main=paste("Barplot for var", x))
  return(y)}
4

3 に答える 3

2

最初に忘れるべきことはas.data.frame(cbind())間違いです。すべての列が同じクラスになることを強制するため、データフレーム構造の利点が失われます。

sapply(data, class)
       x        y        z 
"factor" "factor" "factor"

またA<- sapply(data, class)、上記のように使用して、パス スルーの代わりにベクトルを取得する方が簡単cbindです。また、他の人が言及しているようreturnに、通常の関数では機能しますが、for ループ内では機能しません。for ループを使用する場合は、barplot 呼び出しの結果を収集するための構造が必要であり、すべてが同じ長さになると確信できないため、リストは自然なものです。これは代替ルートである可能性があります。

y <- LETTERS[as.integer(rnorm(100, mean=5, sd=1))]
z <- LETTERS[as.integer(rnorm(100, mean=10, sd=1))]
x <- round(rnorm(100, mean=5, sd=2.5),2)
data <- data.frame(x=x,y=y,z=z)
CC <- grep("character|factor", sapply(data, class))
y <- list()
 for (i in seq_along(CC) ) {
   x <- CC[i]
   counti <- table(data[,x]) 
   y <- c(y, list(barplot( counti, main=paste("Barplot for var", x))))
   }
 y
#------------    
[[1]]
     [,1]
[1,]  0.7
[2,]  1.9
[3,]  3.1
[4,]  4.3
[5,]  5.5
[6,]  6.7

[[2]]
     [,1]
[1,]  0.7
[2,]  1.9
[3,]  3.1
[4,]  4.3
[5,]  5.5
[6,]  6.7
于 2012-05-17T22:24:08.733 に答える
2

ループ内で「return」を使用することはできません。関数内で使用されます。また、プロット間で一時停止することもできます。

par(ask=T)
for (i in 1:length(C)) {
  x <- C[i]
  counti <- table(data[,x])
  y <- barplot(counti, main=paste("Barplot for var", x))
  y
}
于 2012-05-17T21:40:37.793 に答える
1

私はラップリーで何かがより良いかもしれないと思います:

C <- grep("character|factor", B)

FUN <- function(vec, num){
  if (dev.interactive()) dev.new()
  counti <- table(vec)
  y <- barplot(counti, main=paste("Barplot for var", num))
  return(y)
}

lapply(C, function(i) FUN(data[, i], i))
于 2012-05-17T21:44:52.763 に答える