2017-12-27 230 views
0

我是一名大學生,開始探索R考試。 對不起,模糊的標題,因爲我有很多與這篇文章有關的問題。R - 來自抽樣的頻率直方圖:效率和更多

我遇到了抽樣男性(M)或女性(F)人羣的問題。我希望定義一個函數,該函數可以計算該羣體中男性和女性的數量,然後創建大小爲sample.sizesample.number樣本,並返回包含樣本總體大小的女性樣本比例的數據框以及相關頻率。

我敢肯定有一個簡單的和精心優化的方式來做到這一點,但我已經寫了一個小功能(勉強)工作原理:

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循環是非常低效的方法。有沒有更好的辦法?

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 
    } 

我通過分配與一個樣本列表popsa的每個元素開始,然後我使用popsa從每個樣品中創建表,並將其存儲在popsa.factor。然後我計算女性在總數中的比例並將其存儲在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.proportion得到在載體中每一個的比例,和表這些值,以獲得頻率,將它們存儲到popsa.frequency。現在我試圖通過欺騙並將popsa.frequency的名稱作爲數字並將它們存儲爲數據幀的第一列來嘗試將因子popsa.frequency轉換爲數據幀。正如我想要的那樣,函數然後返回popsa.frame

popsa.frame雖然仍然在其第一列(Level)中繼承了popsa.frequency的因子屬性。我該如何改變這一點?我是不是該?

由於這些是樣本分佈的頻率,我想從該數據框創建一個直方圖,但hist()只接受數值向量,所以popsa.frame不是有效的對象。儘管如此,plot(popsa.frame)或多或少會返回我想要的。我如何創建這樣一個直方圖?

編輯:下面的標記答案,我也想出瞭如何簡單地將函數創建的數據框轉換爲一個對象,hist()實際上可以用來創建頻率直方圖(雖然使用barplot產生更多或大致相同的圖形,可能是一個比較正確的統計方法來顯示這樣的結果):

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來了解如何更改參數。

P.S .:看這post線寬的細節。