Noah Olsen
Noah Olsen

Reputation: 281

R Function with for Loops creates several dataframes, how to have each one have a different name

I have a for loop that loops through a list of urls,

url_list <- c('http://www.irs.gov/pub/irs-soi/04in21id.xls',
          'http://www.irs.gov/pub/irs-soi/05in21id.xls',
          'http://www.irs.gov/pub/irs-soi/06in21id.xls', 
          'http://www.irs.gov/pub/irs-soi/07in21id.xls',
          'http://www.irs.gov/pub/irs-soi/08in21id.xls', 
          'http://www.irs.gov/pub/irs-soi/09in21id.xls',
          'http://www.irs.gov/pub/irs-soi/10in21id.xls',
          'http://www.irs.gov/pub/irs-soi/11in21id.xls',
          'http://www.irs.gov/pub/irs-soi/12in21id.xls',
          'http://www.irs.gov/pub/irs-soi/13in21id.xls',
          'http://www.irs.gov/pub/irs-soi/14in21id.xls',
          'http://www.irs.gov/pub/irs-soi/15in21id.xls')

dowloads an excel file from each one assigns it to a dataframe and performs a set of data cleaning operations on it.

library(gdata)
for (url in url_list){
  test <- read.xls(url)
  cols <- c(1,4:5,97:98)
  test <- test[-(1:8),cols]
  test <- test[1:22,]
  test <- test[-4,]
  test$Income <-test$Table.2.1...Returns.with.Itemized.Deductions..Sources.of.Income..Adjustments..Itemized.Deductions.by.Type..Exemptions..and.Tax..Items..by.Size.of.Adjusted.Gross.Income..Tax.Year.2015..Filing.Year.2016.
  test$Total_returns <- test$X.2
  test$return_dollars <- test$X.3
  test$charitable_deductions <- test$X.95
  test$charitable_deduction_dollars <- test$X.96
  test[1:5] <- NULL
}

My problem is that the loop simply writes over the same dataframe for each iteration through the loop. How can I have it assign each iteration through the loop to a data frame with a different name?

Upvotes: 0

Views: 52

Answers (3)

Gautam
Gautam

Reputation: 2753

Here's another approach with lapply instead of for loops which will write all resulting data.frames as separate list items which can then be re-named (if needed).

url_list <- c('http://www.irs.gov/pub/irs-soi/04in21id.xls',
              ...
              'http://www.irs.gov/pub/irs-soi/15in21id.xls')

readURLFunc <- function(z){
  test <- readxl::read_xls(z)
  ...
  test[1:5] <- NULL
  return(test)}

data_list <- lapply(url_list, readURLFunc)

Upvotes: 0

tobiasegli_te
tobiasegli_te

Reputation: 1463

You could write to a list:

result_list <- list()
for (i_url in 1:length(url_list)){
    url <- url_list[i_url]
    ...
    result_list[[i_url]] <- test
}

You can also name the list

names(result_list) <- c("df1","df2","df3",...)

Upvotes: 0

Kelli-Jean
Kelli-Jean

Reputation: 1447

Use assign. This question is a duplicate of this post: Change variable name in for loop using R

For your particular case, you can do something like the following:

for (i in 1:length(url_list)){
  url = url_list[i]
  test <- read.xls(url)
  cols <- c(1,4:5,97:98)
  test <- test[-(1:8),cols]
  test <- test[1:22,]
  test <- test[-4,]
  test$Income <-test$Table.2.1...Returns.with.Itemized.Deductions..Sources.of.Income..Adjustments..Itemized.Deductions.by.Type..Exemptions..and.Tax..Items..by.Size.of.Adjusted.Gross.Income..Tax.Year.2015..Filing.Year.2016.
  test$Total_returns <- test$X.2
  test$return_dollars <- test$X.3
  test$charitable_deductions <- test$X.95
  test$charitable_deduction_dollars <- test$X.96
  test[1:5] <- NULL
  assign(paste("test", i, sep=""), test)
}

Upvotes: 1

Related Questions