【问题标题】:Adding new column to list of data frames将新列添加到数据框列表
【发布时间】:2019-07-02 15:40:59
【问题描述】:

我正在清理从 excel 导入的一些数据,从大量文件中导入,并且在导入期间必须根据文件名的下标创建两个键。这些文件按国家/地区导入。我设法将文件导入到单独的数据框中,但在创建新变量时遇到了困难。为简洁起见,我设置了 country="usa" 和 year=1980。

我的第一个想法是通过过滤“美国”模式来创建环境中存在的数据框列表。然而,这种风格很差,而且产品似乎是一个与数据框本身没有连接的字符列表。

usadflist <- Filter(is.data.frame, mget(ls(pattern="USA")))

这是我转而调整实际导入的时候,使用dplyr::mutate(),但是无法指定尚未创建的变量,此时我尝试cbind(),如下:

usalist <- list.files(path ="~/Desktop/reports/usa")

for(i in usalist) {
  assign(paste(i),read_excel(path = paste("Desktop/reports/usa/",i,sep="")))
  cbind(usalist[[i]][country]<-"usa", usalist[[i]][year]<-1980)
}

给出错误消息:*tmp*[[i]] 中的错误:下标超出范围。

我期望每个数据框都有一个新变量:country,值为“usa”和一个变量:year,值为 1980。任何帮助将不胜感激。

【问题讨论】:

    标签: r loops dplyr lapply


    【解决方案1】:

    您是否尝试过类似的方法:

    usalist <- list.files(path ="~/Desktop/reports/usa")
    
    for(i in 1:length(usalist)){
      df <- read_excel(path = paste("Desktop/reports/usa/", usalist[i], sep = ""))
      df$country <- "usa"
      df$year <- 1980L
      assign(usalist[i], df); rm(df)
    }; rm(i)
    

    没有运行它,所以我不能说我是否没有输入错误。

    【讨论】:

    • 感谢@Feakster,这是正确的。使用临时 df 解决了这个问题。下面更正以避免在循环中使用$,i可以直接在循环中命名,并且新变量需要用引号引起来。 for(i in usalist) { df&lt;- read_excel(path = paste("Desktop/reports/usa/",i,sep="")) df["country"]&lt;-substr(i,start=1,stop=3) df["year"] &lt;-substr(i,start=10,stop=13) assign(i,df);rm(df) }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2015-09-06
    • 2018-08-20
    • 2015-04-23
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多