我有一个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
非常感谢这方面的任何帮助。
答案 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
)。