使用循环在DF中简单描绘变量的条形图

时间:2012-05-17 21:31:59

标签: r loops boxplot

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

理想情况下,我希望循环为每个适当的变量生成一个boxplot。我的循环下面只生成一个boxplot并返回错误:

错误:没有返回的功能,跳到顶级

我错了什么?此外,如果有人能指出我的参考/网站可以理顺我的循环写作方式,我会很乐意帮助。

谢谢! 克里斯

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)}

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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

答案 2 :(得分: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))