【发布时间】:2017-03-23 17:04:11
【问题描述】:
我正在尝试通过随机抽样现有数据框来创建新数据框。具体来说,我想创建一个与原始数据框大小相同的数据框,但新数据框的每一列都是原始数据框中相应列的随机样本(有替换)。我的第一次尝试是这样的:
# 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
虽然,我看不出我做错了什么。谁能提供实现我目标的简洁方法?
【问题讨论】:
-
请注意,
apply会将您的 data.frame 转换为矩阵并返回一个矩阵。您可能想改用lapply。 -
但这不会返回一个列表,所以我不得不将它重铸为 data.frame 吗?
-
Data.frames 是列表。矩阵就是向量。