Question

I am trying to create a new data frame which is identical in the number of columns (but not rows) of an existing data frame. All columns are of identical type, numeric. I need to sample each column of the original data frame (n=241 samples, replace=T) and add those samples to the new data frame at the same column number as the original data frame.

My code so far:

#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)}

The code isn't working out. Any ideas on how to get this to work?

Was it helpful?

Solution 2

There are several issues here. Probably the one that is causing things not to work is that you are trying to access a column of the data frame data3. To do that, you use the following data3[, i]. Note the comma. That separates the row index from the column index.

Additionally, since you already know how big your data frame will be, allocate the space from the beginning:

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

tree.df is already prepopulated with missing (NA) values so you don't need to do it again. You can now rewrite your for loop as

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

Notice I spelled out TRUE. This is better practice than using T because T can be reassigned. Compare:

T
T <- FALSE
T
TRUE <- FALSE

OTHER TIPS

Use the fact that a data frame is a list, and pass to lapply to perform a column-by-column operation.

Here's an example, taking 5 elements from each column in iris:

 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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top