从csv文件名列表中读取到R中

时间:2014-04-26 22:17:35

标签: r list csv indexing

我正在研究在R

中导入多个csv文件
temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i]))

然而

temp[1] returns "something.csv"
.......

我的代码有问题吗?

3 个答案:

答案 0 :(得分:4)

当我们拥有for(和其他sapply函数)时,无需{R} *apply循环。

在这种情况下,没有其他参数sapply会返回一个命名的数据框列表,我将其称为read.all

> temp <- list.files(pattern = "*.csv")
> read.all <- sapply(temp, read.csv)

查看read.all表示它是命名数据框列表。

然后,您可以使用

按文件名访问各个数据框
> read.all[["filename.csv"]]  ## or read.all["filename.csv"]

或使用$运算符

> read.all$filename.csv

答案 1 :(得分:2)

解决方案:

修正:1)必须使用double - [[]]来获取单个列表元素2)不要使用assign()

所以:

for (i in 1:length(temp)) { temp[[i]] <- read.csv(temp[i]) }

或者,如果您不想覆盖临时变量:

df = c(rep(data.frame(), length(temp))) # list of empty dataframe
for (i in 1:length(temp)) { df[[i]] <- as.list(read.csv(temp[i])) }

原始代码中有两个单独的错误:

  1. 使用单个[]而不是双[[]]。 Single []为您提供 列表切片,其中包含一个元素 (不是您要分配的内容),而不是 只是那个实际元素

  2. 正如@ G-Grothendieck所说,
  3. assign没有按照你的想法行事。

  4. 您只想做temp[[i]] <- read.csv(temp[i])

    但您实际上正在做的是将名称包含在temp [i] 中的变量分配给 。因此,如果temp [i]是'whosyour.csv',那么您实际上是在创建并分配给具有该名称的变量,而不是分配给temp [i]本身:

    whosyour.csv <- read.csv('whosyour.csv') # NOT WHAT YOU WANTED!
    

答案 2 :(得分:1)

试试这个:

temp <- list.files(pattern = "*.csv")
## for individual files
dataset <- lapply(temp,FUN=function(files){read.table(files,header=TRUE, sep=",")})
dataset[1] ## for specific files of interest, OR
## If your CSV column structure is same across all csv's bind them all into 1 file
dataset <- do.call("rbind",lapply(temp,FUN=function(files){read.table(files,header=TRUE, sep=",")}))