R语言 如何从给定因子的大型数据框中获取代表性样本

jgwigjjp  于 2023-11-14  发布在  其他
关注(0)|答案(3)|浏览(116)

如果一个列是一个因子,但数据框的每个子集都有不同的大小-可能一个子集有数千行,而另一个子集有数万或数十万行-使用df[sample(nrow(df, n),]进行的采样可能没有足够的行用于特定子集。
采样的 Dataframe 将在ggplot 2中转换为抖动图,我希望每个方面都具有大致相同的样本大小。

dffbzjpn

dffbzjpn1#

在base R中,你要找的是函数bypackage:plyr中的-ply函数将完成类似的工作。它们更强大、更灵活,但使用起来有点麻烦,如果你已经非常熟悉基本的-apply函数,通常就不需要了。
这里有一个问题。运行类似by(iris,iris$Species,function(d) sample(nrow(d)))或其等价物plyrdlply(iris,.(Species),function(d) sample(nrow(d))),将给予你一个样本从每个子 Dataframe 的物种.但它将被索引的子 Dataframe ,而不是整个事情。这应该不是一个问题 * 如果 * 你设计你的数据结构正确。记住这一点,并相应地编写你的绘图脚本。我可能会创建一个类似于 Dataframe 列表的东西,我可以方便地将其转换为绘图每个方面,但从来没有人指责我是一个优秀的程序员。

mzmfm0qo

mzmfm0qo2#

使用@ssdecontrol的答案作为起点,我得出了:

ddply(iris, .(Species), function(d) { d[sample(nrow(d), pmin(nrow(d), 2000)),] })

字符串
它将 Dataframe 按Species因子进行拆分,对每个子集进行采样,然后将其重新组合成一个 Dataframe 。
我使用pmin(nrow(d), 2000)来避免cannot take a sample larger than the population消息。
在这种情况下,iris不是最好的例子,它只包含150行,每个物种只有50行-但同样的逻辑被用于我最初的160万行数据框架,其中有一个子集少于2000行。

yxyvkwin

yxyvkwin3#

若要执行所有因子都表示的分层抽样,您可以使用dagr包中的group_bysample_n

set.seed(0) 
strat_iris <- iris %>%
  group_by(Species) %>%
  sample_n(5)

字符串
在此示例中,您获得一个15行数据集样本,每个因子有5行。

相关问题