通过逐列采样现有数据帧来创建新的(相同的)数据帧

时间:2014-02-05 15:36:41

标签: r dataframe sample

我正在尝试创建一个新数据框,它与现有数据框的列数(但不是行数)相同。所有列都是相同的类型,数字。我需要对原始数据帧的每一列进行采样(n = 241个样本,替换= 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)}

代码无效。关于如何使其发挥作用的任何想法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这里有几个问题。可能导致无法正常工作的是您尝试访问数据框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