从数据框中基于权重或概率抽取样本行

3

我希望能够根据不同的概率从数据框中抽取3组数据(行)。例如,数据如下:

group<-c(1,1,1,2,2,3,3)
var1<-c('aa','ab','ac','ba','bb','ca','ce')
var2<-c('aaa','aba','aca','baa','bba','caa','cba')
var3<-c('aab','abb','acb','bab','bbb','cab','ceb')
data<-data.frame(group,var1,var2,var3)

现在我想从整个数据框中(获取行)根据不同的概率(对于group==1 -> 0.5,group==2 -> 0.4,group==3 -> 0.1)抽样(例如总共5个)。
有人知道如何用R解决这个问题吗?非常感谢您的帮助。祝好!
2个回答

4

可能有更直接的方法,可以通过bysplit实现,并且可能有比我使用的变量名更好的选择,但这应该可以工作:

set.seed(4)
probs <- c(0.5, 0.4, 0.1)
grp_1Row_prob <- probs / table(data$group)
row_probs <- rep(grp_1Row_prob, times = table(data$group))
row_probs
# [1] 0.1666667 0.1666667 0.1666667 0.2000000 0.2000000 0.0500000 0.0500000

sampled_rows <- sample(1:NROW(data), size = 5, prob = row_probs)

data[sampled_rows, ]
#   group var1 var2 var3
# 2     1   ab  aba  abb
# 5     2   bb  bba  bbb
# 4     2   ba  baa  bab
# 1     1   aa  aaa  aab
# 6     3   ca  caa  cab

1
考虑使用来自dplyr的sample_n。
library(dplyr)

group<-c(1,1,1,2,2,3,3)
var1<-c('aa','ab','ac','ba','bb','ca','ce')
var2<-c('aaa','aba','aca','baa','bba','caa','cba')
var3<-c('aab','abb','acb','bab','bbb','cab','ceb')
data<-data.frame(group,var1,var2,var3)

sample_n(data, size = 5, weight = group)

#  group var1 var2 var3
#7     3   ce  cba  ceb
#2     1   ab  aba  abb
#4     2   ba  baa  bab
#6     3   ca  caa  cab
#3     1   ac  aca  acb

1
我认为这样不会分配正确的权重/概率吧?使用 weight = group 会将组3的权重分配为2/7 = 0.2857,而不是问题中描述的所需的0.1。 - JasonAizkalns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接