0

I am analyzing a yearly dataset. I would like to reshape and rename the data. How could I use the LOOP to simplify the following code?

marryc2010 <- data.frame(date=c2010$Date,EC=c2010$`Elemental Carbon by transmittance-PM10`,OC=c2010$`Organic Carbon by transmittance-PM10`)
marryc2011 <- data.frame(date=c2011$Date,EC=c2011$`Elemental Carbon by transmittance-PM10`,OC=c2011$`Organic Carbon by transmittance-PM10`)
marryc2012 <- data.frame(date=c2012$Date,EC=c2012$`Elemental Carbon by transmittance-PM10`,OC=c2012$`Organic Carbon by transmittance-PM10`)
marryc2013 <- data.frame(date=c2013$Date,EC=c2013$`Elemental Carbon by transmittance-PM10`,OC=c2013$`Organic Carbon by transmittance-PM10`)
marryc2014 <- data.frame(date=c2014$Date,EC=c2014$`Elemental Carbon by transmittance-PM10`,OC=c2014$`Organic Carbon by transmittance-PM10`)
marryc2015 <- data.frame(date=c2015$Date,EC=c2015$`Elemental Carbon by transmittance-PM10`,OC=c2015$`Organic Carbon by transmittance-PM10`)
marryc2016 <- data.frame(date=c2016$Date,EC=c2016$`Elemental Carbon by transmittance-PM10`,OC=c2016$`Organic Carbon by transmittance-PM10`)
marryc2017 <- data.frame(date=c2017$Date,EC=c2017$`Elemental Carbon by transmittance-PM10`,OC=c2017$`Organic Carbon by transmittance-PM10`)
marryc2018 <- data.frame(date=c2018$Date,EC=c2018$`Elemental Carbon by transmittance-PM10`,OC=c2018$`Organic Carbon by transmittance-PM10`)
marryc2019 <- data.frame(date=c2019$Date,EC=c2019$`Elemental Carbon by transmittance-PM10`,OC=c2019$`Organic Carbon by transmittance-PM10`)
  • Maybe https://stackoverflow.com/a/24376207/12993861 or https://stackoverflow.com/a/68136880/12993861 helps to put your dataframes into a list which can be easily looped over. – stefan Jun 26 '21 at 22:03

2 Answers2

2

An easy way is to use purrr::map over your list of dataframes.

library(purrr)
library(dplyr)

# Create a list of the dataframes, and return values as object names.
df.list <- mget(paste0("c", 2010:2019))

# Then, use map to extract the columns that you need from each dataframe.
dfs.updated <-
  purrr::map(
    .x = df.list,
    .f = function(x) {
      x %>% dplyr::select(
        Date,
        `Elemental Carbon by transmittance-PM10`,
        `Organic Carbon by transmittance-PM10`
      )
    }
  )

# Then, can rename if needed.
names(dfs.updated) <- paste0("marry", 2010:2019)
AndrewGB
  • 16,126
  • 5
  • 18
  • 49
2

You should not be creating 10 separate dataframes. You should be creating them inside a list so you can later use lapply to work with them in a bundle.

input_list <- mget( paste0('c', 2010:2019)  # Now inputs are in one list 
marry_list <- lapply( input_list, function(x) { 
                                data.frame(date=x$Date,
                                   EC=x$`Elemental Carbon by transmittance-PM10`,
                                   OC=x$`Organic Carbon by transmittance-PM10`)}
names(marry_list) <- paste0("marry", 2010:2019)

When you need to get one of them it's as simple as:

 df_val <- marry_list[['marry2015']]

Or

 df_val <- marry_list$marry2015

If you just wanted the date column from one of them then is could be either of these:

 marry_list$marry2019$date  # both `$` and `[[` can be chained
 marry_list[['marry2019']][['date']]  # use `[[` inside function, `$` at console
IRTFM
  • 258,963
  • 21
  • 364
  • 487