我是一名大學生,開始探索R考試。 對不起,模糊的標題,因爲我有很多與這篇文章有關的問題。R - 來自抽樣的頻率直方圖:效率和更多
我遇到了抽樣男性(M)或女性(F)人羣的問題。我希望定義一個函數,該函數可以計算該羣體中男性和女性的數量,然後創建大小爲sample.size
的sample.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)
所以,你想爲你的每一個data.frame'做直方圖嗎? – patL
不完全是,我希望創建一個直方圖,其中「y」軸是頻率,「x」軸是比例值。 @patL 類似[This](https://i.imgur.com/pgSRKX9.png),但帶有直方圖的列。 –