我正在尝试通过随机抽样现有数据框来创建新数据框。具体来说,我想创建一个与原始数据帧大小相同的数据帧,但新数据帧的每一列都是原始数据帧中相应列的随机样本(替换)。我的第一次尝试看起来像这样:
# Create toy data set
data.set <- as.data.frame(matrix(1:50, ncol = 5))
# Change names
colnames(data.set) <- c("Stuff", "Things", "Foo", "Bar", "Guff")
# Try to create randomly sampled data frame
data.set %>% sample_n(replace = TRUE, size = nrow(data.set))
这里的问题是它只是随机地对行进行采样,而不是逐个采样每个列中的元素。例如,这是一些输出。
Stuff Things Foo Bar Guff
2 2 12 22 32 42
10 10 20 30 40 50
2.1 2 12 22 32 42
3 3 13 23 33 43
5 5 15 25 35 45
3.1 3 13 23 33 43
8 8 18 28 38 48
9 9 19 29 39 49
1 1 11 21 31 41
6 6 16 26 36 46
请注意,第一行和第三行完全相同,第四行和第六行也是如此。我想要的是每个列随机采样独立。所以,我试过了。
apply(data.set, MARGIN = 2, sample_n, replace = TRUE, size = nrow(data.set))
产生了以下错误:
Error: Don't know how to sample from objects of class integer
但是,我看不出我做错了什么。任何人都可以提供一种简洁的方法来实现我的目标吗?
答案 0 :(得分:3)
首先,apply函数应该有参数。在这种情况下,我们使用列,因为边距是2。
apply(df, MARGIN = 2, function(x) sample(x, replace = TRUE, size = length(x)))