【问题标题】:Create a new (identical) data frame by sampling an existing data frame column-wise通过按列对现有数据框进行采样来创建新的(相同的)数据框
【发布时间】:2014-02-05 15:36:41
【问题描述】:

我正在尝试创建一个与现有数据框的列数(但不是行数)相同的新数据框。所有列都是相同类型的数字。我需要对原始数据帧的每一列进行采样(n=241 个样本,replace=T)并将这些样本添加到与原始数据帧相同的列号的新数据帧中。

到目前为止我的代码:

#create the new data frame
tree.df <- data.frame(matrix(nrow=0, ncol=72))
#give same column names as original data frame (data3)
colnames(tree.df)<-colnames(data3)
#populate with NA values
tree.df[1:241,]=NA
#sample original data frame column wise and add to new data frame
for (i in colnames(data3)){
  rbind(sample(data3[i], 241, replace = T),tree.df)}

代码无法正常工作。关于如何让它发挥作用的任何想法?

【问题讨论】:

    标签: r dataframe sample


    【解决方案1】:

    利用数据框是一个列表这一事实,并传递给lapply 以执行逐列操作。

    这是一个示例,从iris 的每一列中提取 5 个元素:

     as.data.frame(lapply(iris, sample, size=5, replace=TRUE))
    ##   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    ## 1          5.7         3.2          1.7         0.2 versicolor
    ## 2          5.8         3.1          1.5         1.2     setosa
    ## 3          6.0         3.8          4.9         1.9  virginica
    ## 4          4.4         2.5          5.3         0.2 versicolor
    ## 5          5.1         3.1          3.3         0.3     setosa
    

    【讨论】:

    • 我的回答更多是为了解释代码中的错误。这是执行此任务的更惯用和更好的方式。
    【解决方案2】:

    这里有几个问题。可能导致事情不起作用的原因是您正试图访问数据框data3 的列。为此,您可以使用以下data3[, i]。注意逗号。这将行索引与列索引分开。

    此外,由于您已经知道数据框有多大,请从头开始分配空间:

    tree.df <- data.frame(matrix(nrow = 241, ncol = 72))
    

    tree.df 已经预先填充了缺失的 (NA) 值,因此您无需再次执行此操作。您现在可以将 for 循环重写为

    for (i in colnames(data3)){
      tree.df[, i] <- sample(data3[, i], 241, replace = TRUE)
    }
    

    注意我拼写了TRUE。这比使用T 更好,因为T 可以重新分配。比较:

    T
    T <- FALSE
    T
    TRUE <- FALSE
    

    【讨论】:

    • 感谢您的反馈,这在指定开头的行数和列数后有效。我不敢相信我错过了循环中的行规范。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多