我是一名大学生,开始为考试探索 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
循环确实是执行此操作的低效方法。有没有更好的办法?
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
,尽管如此,仍保留popsa.frequency
其第一列 ( Level
) 中的因子属性。我怎样才能改变这个?我是不是该?
由于这些是样本分布的频率,我想从这个数据帧创建一个直方图,尽管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)
列表和 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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句