我是一名大学生,开始探索R参加考试。 对于模糊的标题感到抱歉,因为我有很多与此帖有关的问题。
我遇到了对男性(M)或女性(F)人群进行抽样的问题。我希望定义一个函数,该函数可以获取此群体中的男性和女性数量,然后创建大小为sample.number
的{{1}}个样本,并返回一个数据框,其中包含女性在总大小上的样本比例样本,有相关频率。
我很肯定有一种简单且经过优化的方法可以做到这一点,但我已经写了一个小功能(几乎没有):
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()
答案 0 :(得分:0)
您的函数有一些默认值,只需执行data.frame
即可创建senators()
。
按照您的数据我会这样做:
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的线宽详细信息。
答案 1 :(得分: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()