在r中使用read csv命令中的变量

时间:2015-04-16 20:55:40

标签: r

我有一个包含许多csv文件的文件夹,我想创建一个函数,它将接收一个数字范围作为参数,函数将通过该范围选择所选文件(名为1.csv,2.csv等)和将它们插入一个数据框中。我试过了:

fun <- function(range){
  for( i in range){
    dat <- read.csv("K:/R program/",i,".csv")
  }
  dat
}

我有一些问题。首先,我可能每次迭代都会遍历数据。其次,读取功能不起作用并产生错误。

2 个答案:

答案 0 :(得分:1)

有两个问题:

  1. 您在每次迭代时都会覆盖dat
  2. 您正在将参数传递给read.csv(),而不是将部分文件名粘贴到单个字符串中。
  3. file.path()函数在这里通常很有用,但是在这里使用paste0()更方便,因为你在变量中有部分文件名并且需要添加扩展名。我可能会尝试(对您的数据做一些假设)

    fun <- function(range, ...){
      dat <- vector(mode = "list", length = length(range))
      for (i in seq_along(range)){
        path <- paste0("K:/R program", range[i], ".csv")
        dat[[i]] <- read.csv(file = path, ...)
      }
      dat
    }
    

    一些解释,一行一行:

    1. 创建一个列表对象来保存数据
    2. 设置循环,但将i设为整数索引i = {1,2,...,n}
    3. 使用paste0()
    4. 构建路径
    5. 阅读数据文件并将其分配给i
    6. dat元素
    7. 返回dat

答案 1 :(得分:0)

sprintf应该可以工作,例如

for (i in 1:length(urls)) {
  download.file(urls[i], sprintf("~/Desktop/rstats/temp%i.csv.gz", i))
}

为避免覆盖您的数据,请在每个for-step中初始化数据框并绑定行。

df <- data.frame()
library(dplyr)

for (i in 1:length(urls)) {
  df.csv <- read.csv(sprintf("~/Desktop/rstats/temp%i.csv", i))
  dummy.df <- df.csv %>% dplyr::select(date, package, version, country)
  df <- dplyr::bind_rows(df, dummy.df)
}