我正在研究在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"
.......
我的代码有问题吗?
答案 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])) }
原始代码中有两个单独的错误:
使用单个[]而不是双[[]]。 Single []为您提供 列表切片,其中包含一个元素 (不是您要分配的内容),而不是 只是那个实际元素 强>
assign
没有按照你的想法行事。
您只想做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=",")}))