2012-05-17 4 views
2

모든 작성 루프에서 많은 경험이 없으므로 새로운 모든 데이터 세트에서 자주 수행하는 작업을 자동화하려고합니다. 각 변수의 상자 플롯 및 막대 그래프 작성 잘 설명 통계를 계산하십시오. 후자의 경우 설명 (Hmisc) 및/또는 통계 (fileds)를 사용하는 경향이 있습니다.DF에서 루프를 사용하여 변수를 단순 바코드로 변환

이상적으로는 루프가 각 적절한 변수에 대해 하나의 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

왜 당신은 for 루프에 return (y)를 추가합니까? 그것을 제거하면 루프가 예상대로 작동합니다. – sgibb

+1

회피를 피하는 데 도움이되는 [R Inferno] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf)를 알려 드리겠습니다. 그리고'ggplot2'를 향해, 특히'facet_wrap'을 사용하면 이런 종류의 플로팅을 할 수 있습니다. – Justin

+0

우수 포인트 저스틴. 나는 '1 : 길이 (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-loop를 사용하여 수행하려는 경우 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에서 시작하는 똑같은 실수를 저지른 것을 기억합니다. 직감입니다. 나는 당신이 직면하고 있다고 생각합니다. 변화시키는 유일한 방법은 당신이 한 일을 정확하게하는 것입니다. 사람들에게 알리십시오. :) –