2017-12-27 3 views
0

저는 대학생으로서 R을 시험하기 시작했습니다. 막연한 제목으로 불편을 끼쳐 드려 죄송합니다.이 게시물과 관련된 많은 질문이 있습니다.R - 샘플링에서 얻은 빈도 막대 그래프 : 효율 등

남성 (M) 또는 여성 (F) 인 인구를 샘플링하는 문제가 발생했습니다. 이 인구에서 남성과 여성의 수를 취할 수있는 함수를 정의한 다음 sample.number 크기의 샘플을 sample.size으로 만들고 관련 빈도와 함께 샘플의 전체 크기에 대한 여성의 샘플 비율을 포함하는 데이터 프레임을 반환합니다.

나는이 작업을 수행 할 수있는 간단하고 잘 최적화 된 방법이 확실 해요,하지만 난 (거의) 작동하는 작은 함수를 작성했습니다 :

senators <- function(Fem = 13, 
       Mal = 87, 
       sample.size = 10, 
       sample.number = 100){ 

pop <- c(rep("F", Fem), rep("M", Mal)) # I create the population base 

popsa <- list(NA)   # I make some empty variables used later 
popsa.factor <- list(NA) # Not sure if this passage is even needed... 
popsa.proportion <- list(NA) 

가 여기에 for 루프를 제공합니다. 난 그걸 읽고 for 루프 정말 비효율적 인 방법입니다 읽었습니다. 더 좋은 방법이 있습니까? I는 샘플 popsa리스트의 각 요소에 할당함으로써 시작

for(i in 1:sample.number){ 
    popsa[[i]] <- sample(pop, sample.size, replace = TRUE) 
    popsa.factor[[i]] <- table(factor(popsa[[i]], levels = c("M", "F"))) 
    popsa.proportion[[i]] <- popsa.factor[[i]][2]/sample.size 
    } 

후 I는 각각의 샘플에서 테이블을 만들고 popsa.factor에 저장하는 popsa를 사용한다. 그런 다음 여성의 비율을 계산하여 popsa.proportion에 저장합니다. 이 for 루프는 나에게 지저분 해 보입니다. 그리고 많은 샘플을 처리하는 속도가 정말 느립니다. 내가 여기서 한 일을 더 효율적이고 효과적으로 수행 할 수있는 방법이 있습니까?

popsa.unlisted <- unlist(popsa.proportion) 
popsa.frequency <- table(popsa.unlisted) 

popsa.frame <- data.frame(Level = as.numeric(names(popsa.frequency)), 
          Freq = as.numeric(popsa.frequency)) 
return(popsa.frame) 
} # This closes the function call 

popsa.frequency로 저장, 주파수를 얻기 위하여 각 벡터에 비례하고, 테이블 값들을 얻을 popsa.proportion를 I 다음 올라가지. 이제 popsa.frequencypopsa.frequency의 이름을 부정하고 변환하여 데이터 프레임의 첫 번째 열로 저장하여 데이터 프레임에 넣으려고합니다. 그런 다음 함수는 popsa.frame을 반환합니다.

popsa.frame은 여전히 ​​첫 번째 열 (Level)에 popsa.frequency의 요인 속성을 전달합니다. 이걸 어떻게 바꿀 수 있니? 해야합니까?

이들은 표본 분포의 빈도이기 때문에 hist()은 숫자 벡터 만 허용하기 때문에이 데이터 프레임에서 막대 그래프를 만들고 싶습니다. 따라서 popsa.frame은 유효한 개체가 아닙니다. plot(popsa.frame)은 내가 원하는 것보다 더 많거나 적은 것을 반환합니다. 어떻게 그러한 막대 그래프를 만들 수 있습니까?

편집 : 아래 표시된 대답에 따라 기능을 만드는 데이터 프레임을 hist()이 실제로 주파수 막대 그래프를 만드는 데 사용할 수있는 객체로 변환하는 방법을 알아 냈습니다 (막대 그래프를 사용하면 더 많은

result <- senators(Fem=13,Mal=87,sample.size=50,sample.number=10000) 

raw <- sapply(1:length(result$Level), function(x){ 
    rep(result$Level, result$Freq) 
}) 

hist(raw) 
+0

그래서 'data.frame'의 각 열에 대해 히스토그램을 만들고 싶습니까? – patL

+0

정확하게는 아니지만, 하나의 막대 그래프를 만들고 싶습니다. 여기서 "y"축은 주파수이고 "x"축은 비율 값입니다. @patL [This] (https://i.imgur.com/pgSRKX9.png)와 비슷하지만 막대 그래프의 열이 있습니다. –

답변

0

목록 및 for 루프를 만들면 성능 병목 현상이 발생합니다. sapply을 사용하여 for loop과 일부 임시 변수를 제거 할 수있었습니다.

데이터 명성을 반환하고 다른 옵션은 벡터 결과를 반환하여 최종 플롯의 히스토그램 플로팅 기능에 결과를 전달합니다.

senators <- function(Fem = 13, 
        Mal = 87, 
        sample.size = 10, 
        sample.number = 100){ 

    pop <- c(rep("F", Fem), rep("M", Mal)) # I create the population base 

    answer<-sapply(1:sample.number, function(x){popsa <- sample(pop, sample.size, replace = TRUE); 
              length(popsa[popsa=="F"])/sample.size}) 

popsa.frequency <- table(answer) 

popsa.frame <- data.frame(Level = as.numeric(names(popsa.frequency)), 
          Freq = as.numeric(popsa.frequency)) 
return(popsa.frame) 
} 

senators() 
1

함수는 단지 senators()을 수행하여 data.frame의 창조에 이르게 몇 가지 기본 값이 : 이하 동일 그래프, 그리고 아마도)와 같은 결과를 보여보다 통계적으로 올바른 방법이 될 수.

내가 할 것 데이터를 다음과 같습니다

df <- senators() # using default values 
plot(df, type="h", lwd = 5, lend=1) # type changes your plot type while lwd changes line sizes, while lend would give squared aspect yo your bars. 

은 당신이 할 수있는 플롯의 유형을 볼 수 ?plot에서 살펴 보자. 또한 ?par을 수행하여 매개 변수를 변경하는 방법을 확인할 수 있습니다.

추신 : 선의 너비에 대한 자세한 내용은 post을 참조하십시오.