根据data.frame中的权重或概率对行进行抽样

时间:2016-05-18 14:08:19

标签: r

我想根据不同的概率从数据帧中的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)

现在我想基于不同的概率从整个数据帧(获取行)中抽样(例如,总共5个)(对于组== 1 - > 0.5,组== 2 - > 0.4,组== 3 - &gt; 0.1)

有谁知道用R解决这个问题?非常感谢帮助。 干杯

...

2 个答案:

答案 0 :(得分:2)

通过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 :(得分:1)

考虑使用sample_n中的dplyr

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