2

在编写循环方面没有太多经验,我希望自动化(使用循环)我经常对所有新数据集执行的操作:创建每个变量的箱线图和直方图,以及计算描述性统计数据,对于后者,我倾向于同时使用描述(Hmisc)和/或统计(归档)。

理想情况下,我想让循环为每个适当的变量生成一个箱线图。我下面的循环只产生一个箱线图并返回错误:

错误:没有要返回的函数,跳转到顶层

我怎么了?另外,如果有人能指出我的参考/网站可以纠正我不足的循环编写方式,我会很乐意提供帮助。

谢谢!克里斯

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

你不能在循环中使用“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 回答
2

你应该忘记的第一件事是as.data.frame(cbind())错误。它强制所有列属于同一类,从而破坏了数据框结构的任何好处。

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

A<- sapply(data, class)像上面那样使用并获得一个向量而不是那种折磨人的 pass through也会更简单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 回答
1

我认为 lapply 的东西可能会更好:

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 回答