2012-05-17 24 views
2

在所有編寫循環方面沒有太多經驗,我期望自動化(帶循環)我經常使用所有新數據集的東西:創建每個變量的箱形圖和直方圖,如以及計算描述性統計數據,對於後者,我傾向於同時使用describe(Hmisc)和/或stats(fileds)。在DF中使用循環的變量的簡單barplot

理想情況下,我想讓循環爲每個適當的變量生成一個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

爲什麼你添加'return(y)'給你的循環?刪除它,你的循環會像預期的那樣工作。 – sgibb

+1

我會給你指出[R Inferno](http://www.burns-stat.com/pages/Tutor/R_inferno.pdf),以幫助你避免循環。對於這種繪圖,朝着'ggplot2',特別是'facet_wrap'。 – Justin

+0

賈斯汀優秀點。我不認爲'1:length(C)'是必要的,只需像我一樣直接傳遞C即可。然後你可以擺脫'x < - C [i]'和其他任何你有'x'的地方用'i'取代 –

回答

2

不能使用在循環「迴歸」,它的功能被使用。你可能也想地塊之間做出暫停:

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

我覺得有什麼用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)) 
2

你應該忘掉的第一件事是as.data.frame(cbind())錯誤。它強制所有列成爲相同的類,從而破壞了數據幀結構的任何好處。

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

它也將是簡單的只使用A<- sapply(data, class)如上,並得到一個載體,而不是那個折磨穿過cbind。正如其他人提到return適用於常規功能,但不適用於for-loop。如果你打算用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 
+0

非常感謝你對錶格上最優秀的指導!作爲與R個人旅程約8個月的人,我當然可以使用這些建議。 – Chris

+0

如果你記得誰教過你使用'as.data.frame(cbind())',我想知道我可以制止它。它不斷出現,並似乎在流行的增加。 –

+0

@DWin我認爲把事情粘貼在一起然後把它變成一個數據框是很直觀的,如果你把'cbind'作爲一個動作而'data.frame'作爲一個屬性的話。我記得自己也是從R開始犯同樣的錯誤。直覺我認爲你正在面對,改變它的唯一方法就是做你剛做的事......告知人們。 :) –