Search code examples
rlistdataframefor-loopassign

Dynamically Create a New Column in R


I am trying to improve my code and avoid repeating lines to import multiple csvs with same name structure:

iOS_Weekly_Active_Users_20210301 <- read.csv("iOS_Weekly_Active_Users_20210301.csv", header = T)
iOS_Weekly_Active_Users_20210301$WeekDate <- "2021-03-01"
iOS_Weekly_Active_Users_20210308 <- read.csv("iOS_Weekly_Active_Users_20210308.csv", header = T)
iOS_Weekly_Active_Users_20210308$WeekDate <- "2021-03-08"
iOS_Weekly_Active_Users_20210315 <- read.csv("iOS_Weekly_Active_Users_20210315.csv", header = T)
iOS_Weekly_Active_Users_20210315$WeekDate <- "2021-03-15"
iOS_Weekly_Active_Users_20210322 <- read.csv("iOS_Weekly_Active_Users_20210322.csv", header = T)
iOS_Weekly_Active_Users_20210322$WeekDate <- "2021-03-22"

I managed to implement it to read the csv but I don't know how to as well insert the part where I create a new column WeekDate to the data frame and where I give it the date value.

week_date_list <- c("20210301", "20210308", "20210315", "20210322" )

for(week_date in week_date_list){
  
  assign(paste0("iOS_Weekly_Active_Users_", week_date), read.csv(paste0("iOS_Weekly_Active_Users_", week_date, ".csv"), header = T))
         
}

Solution

  • It is not recommended to create multiple objects in the global env. This could be easily done by storing in a list (used R 4.1.0 for lambda (\(week_date)) or use function(week_date)

    lst1 <- lapply(week_date_list, \(week_date) {
              tmp <- read.csv(paste0("iOS_Weekly_Active_Users_", 
                                week_date, ".csv"), header = TRUE)
              tmp$WeekDate <- as.Date(week_date, format = "%Y%m%d")
              tmp
       })
    

    In the OP's for loop

    for(week_date in week_date_list){
      tmp <- read.csv(paste0("iOS_Weekly_Active_Users_", week_date, ".csv"),
                 header = TRUE)
       tmp$WeekDate <- as.Date(week_date, format = "%Y%m%d")
       assign(paste0("iOS_Weekly_Active_Users_", week_date), tmp)
     }