2017-12-27 331 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线宽的细节。