我有50 000
行数据。我想从这些数据中制作样本(拆分?)。 Sample-1
可能包含2
个组,每个组的大小为25 000
。 Sample-2
可能包含5
个小组,每个小组都有10 000
个等等。我希望有一个列,其中会有一个值,具体取决于组的数量。例如,在Sample-1
的情况下,在此列中,我将看到1,2,2,1,2,1,1,2
的随机序列。如果是Sample-2
,我会1,3,2,1,4,1,5,...
。我不知道如何在R
中解决这个问题,我希望有一个快速简便的解决方案。
答案 0 :(得分:3)
这是一个想法:
f <- function(n.row, n.group) {
sample(rep(seq_len(n.group), length.out = n.row))
}
## A few sample runs
f(3,2)
# [1] 1 2 1
f(5,2)
# [1] 1 1 2 1 2
f(10,4)
# [1] 1 1 2 2 4 3 2 4 3 1
您会注意到,当组的数量没有干净地划分行数时,“额外”项目将按计数顺序放入组中。如果你不重要(即第1组并不总是得到第一个额外的项目),你可以像这样修改上面的功能:
f2 <- function(n.row, n.group) {
ii <- sample(rep(seq_len(n.group), length.out = n.row))
sample(seq_len(n.group))[ii]
}
## Check that overall frequency of group assignment isn't skewed
f2(3,2)
# [1] 2 1 1
f2(3,2)
# [1] 2 1 2
f2(3,2)
# [1] 2 1 2
答案 1 :(得分:2)
向sample
提供包含无序组的向量。
n.group <- 2
n.row <- 10
unordered <- rep(
seq_len(n.group),
each = n.row / n.group
)
sample(unordered)
seq_len(n.group)
创建一个组号从1到组数的向量。
rep
重复每个组中定义的每个组号
sample
随机播放组号的顺序
如果n.row/n.group
无法保证为整数,则可以使用此
n.group <- 3
n.row <- 10
unordered <- rep(
seq_len(n.group),
each = ceiling(n.row / n.group)
)
sample(unordered, size = n.row)