R函数与for循环创建多个数据框,如何使每个数据框具有不同的名称

时间:2017-11-06 23:51:29

标签: r

我有一个循环遍历网址列表的

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')

从每个文件中下载一个excel文件,将其分配给数据框并对其执行一组数据清理操作。

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
}

我的问题是循环只是通过循环在每次迭代中写入相同的数据帧。如何让它通过循环将每次迭代分配给具有不同名称的数据框?

3 个答案:

答案 0 :(得分:0)

使用assign。此问题与此帖重复:Change variable name in for loop using R

对于您的特定情况,您可以执行以下操作:

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

答案 1 :(得分:0)

你可以写一个列表:

DecimalField

您也可以将名称命名为

code = models.DecimalField(max_digits=8, decimal_places=0, ...)

答案 2 :(得分:0)

这是另一种使用lapply而不是for循环的方法,它将所有生成的data.frames写为单独的列表项,然后可以重新命名(如果需要)。

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)