在所有编写循环中没有太多经验,我希望自动化(使用循环)我经常使用所有新数据集的东西:创建每个变量的箱线图和直方图,以及计算后者的描述性统计,我倾向于同时使用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)}
答案 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))