【问题标题】:R: Randomly sampling (with replacement) each column of a data frame independentlyR:独立随机抽样(有放回)数据帧的每一列
【发布时间】: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 是列表。矩阵就是向量。

标签: r random


【解决方案1】:

首先,apply 函数应该有参数。在这种情况下,我们使用列,因为边距为 2。

apply(df, MARGIN = 2, function(x) sample(x, replace = TRUE, size = length(x)))

【讨论】:

  • 太棒了!谢谢,@Aleksandr。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 2014-06-22
  • 2017-09-13
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多