基于特定列值的概率,将10,000行的数据集采样为100的唯一集合

时间:2014-02-24 09:24:08

标签: r

我有一个20行的数据集,其中有4列A,B,C,D。 [简化数据集]

原始数据集

>data
ID Name Age Type
1  ABC  23   A
2  CDE  34   A
3  ABCE  23   C
4  CDEYU  34   B 
5  ABCW  23   A
6  CDEDR  34   B 
7  ASER  23   A
8  CDEAW  34   B 
9  ABCHKJ  23   A
10  CDEFDE  34   C 
11  ABCDDD  23   A
12  CDEDDD  34   A
13  ABCEDDD  23   C
14  CDEYUDDD  34   B 
15  ABCWDDD  23   A
16  CDEDRDDD  34   B 
17  ASERDDD  23   A
18  CDEAWDDD  34   B 
19  ABCHKJDDD  23   A    
20  CDEFDEDDD  34   C 

这里“类型”列以A,B,C的概率分别为(0.5,0.3,0.2)的方式分布。

现在,我想剪切两个独特的10个集合,这样每个集合将有10行具有相同的概率分布。

我可以使用示例函数来实现此目的吗?

这样的事情:

sample(data, 10, replace=F, prob((data$Type="A")=0.5,(data$Type="B")=0.3,(data$Type="C")=0.2))

另外,我如何编写一个循环来连续获取100行的大量内容?我的意思是来自100行数据集的10组。

预期产出:

数据集1:

ID Name Age Type
1  ABC  23   A
2  CDE  34   A
3  ABCE  23   C
4  CDEYU  34   B 
5  ABCW  23   A
6  CDEDR  34   B 
7  ASER  23   A
8  CDEAW  34   B 
9  ABCHKJ  23   A
10  CDEFDE  34   C 

数据集2:

ID Name Age Type
1  ABCDDD  23   A
2  CDEDDD  34   A
3  ABCEDDD  23   C
4  CDEYUDDD  34   B 
5  ABCWDDD  23   A
6  CDEDRDDD  34   B 
7  ASERDDD  23   A
8  CDEAWDDD  34   B 
9  ABCHKJDDD  23   A
10  CDEFDEDDD  34   C 

非常感谢这方面的任何帮助。

1 个答案:

答案 0 :(得分:0)

这是达到我认为你打算做的事情的一种方法:

d <- data.frame(id=1:100,
                type=sample(unlist(mapply(rep, c('A', 'B', 'C'), 
                                          c(50, 30, 20), USE.NAMES=F))),
                group=NA)

d <- within(d, {
  group[which(type=='A')] <- sample(gl(10, 5))
  group[which(type=='B')] <- sample(gl(10, 3))
  group[which(type=='C')] <- sample(gl(10, 2))
})


foo <- split(d[, 1:2], d$group) 
# above, adjust 1:2 to reflect which columns you want 
#  to include in the split data.frames.

foo[1:2] # First 2 (of 10) elements

$`1`
     id type
20   20    A
31   31    C
34   34    C
37   37    A
42   42    A
52   52    B
60   60    A
74   74    B
77   77    A
100 100    B

$`2`
   id type
1   1    C
17 17    C
27 27    A
46 46    B
57 57    B
58 58    A
62 62    B
71 71    A
72 72    A
89 89    A

列表foo的每个元素都有5 x A,3 x B和2 x C。这是通过依次识别与每个type对应的索引(使用which),然后分配置换组编号1到10(具有与您期望的分布相对应的重复次数)来实现的。最后,split用于将data.frame拆分为data.frames列表。

要将此解决方案推广到包含10,000行的数据集,每个子​​集中包含100行,只需将参数调整为gl,例如: group[which(type=='A')] <- sample(gl(100, 50))(如果大型数据集中有5000 A)。