R - 来自抽样的频率直方图:效率和更多
我是一名大学生,开始探索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)
回答:
创建列表和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()
回答:
你的函数,通过只是在做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线宽的细节。
以上是 R - 来自抽样的频率直方图:效率和更多 的全部内容, 来源链接: utcz.com/qa/265897.html