我正在尝试创建一个新数据框,它与现有数据框的列数(但不是行数)相同。所有列都是相同的类型,数字。我需要对原始数据帧的每一列进行采样(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)}
代码无效。关于如何使其发挥作用的任何想法?
答案 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