Reputation: 45
I am attempting to create a new dataframe based on the results from each iteration of a for loop in R. I have a "weekly_df" which has weekly values for multiple columns. I would like to create a new dataframe which contains the values from each column (based on the iteration number) along with the date columns (Year and Week, which are always the last two columns).
Currently, I have the following data columns (which have numeric values for each row)...
A1 Score, A1 Volume, A2 Score, A2 Volume, A3 Score, A3 Volume, Year, Week
So essentially I want to create a new dataframe for each column up until 'Year'...
A1 Score, Year, Week
A1 Volume, Year, Week
So on and so fourth, but I am unsure how to loop my data to create a new dataframe for each of these. I currently have the following...
for (i in 1:(length(names(weekly_df)) -2)) {
print(weekly_df[,c(i,((length(names(weekly_df))) -1), (length(names(weekly_df))))]) }
This prints the correct 'tibble' for each of the dataframes that I want but I'm unsure how to transform these into saved dataframes in my environment to be used later on.
Here is a reproducible dataset:
A1 Score, A1 Volume, A2 Score, A2 Volume, A3 Score, A3 Volume, Year, Week
1, 2, 3, 4, 5, 6, 2016, 1
7, 8, 9, 10, 11, 12, 2016, 2
13, 14, 15, 16, 17, 18, 2016, 3
And my desired output is each of the following as a dataframe in my environment:
A1 Score, Year, Week
1, 2016, 1
7, 2016, 2
13, 2016, 3
A1 Volume, Year, Week
2, 2016, 1
8, 2016, 2
14, 2016, 3
A2 Score, Year, Week
3, 2016, 1
9, 2016, 2
15, 2016, 3
... so and so fourth as to create a dataframe from each column.
Upvotes: 2
Views: 5211
Reputation: 388817
You can use :
n <- ncol(weekly_df)
list_df <- lapply(names(weekly_df)[-c(n-1, n)], function(x)
cbind(weekly_df[x], weekly_df[c(n-1, n)]))
This will return you a list of dataframes, usually it is better to keep data in a list since it is easier to manage and avoids creating lot of variables in the global environment but if you want them as separate dataframes, you can name the list and use list2env
.
list_df <- paste0('data', seq_along(list_df))
list2env(list_df, .GlobalEnv)
Upvotes: 1