list.files函数中的for循环仅为最后一个i(R)生成结果

时间:2014-04-23 11:04:53

标签: r csv for-loop read.table

我有一个目录,其中包含两个.csv个文件,我想要读取并导入到R中。

到目前为止,我已尝试过以下实际可行的代码。但仅适用于其中一个文件。

for (i in list.files(path = ".", pattern = "\\.csv$")){
    print(i)
    f <- read.table(i, fill=TRUE, row.names=NULL)
    Table <- data.frame(f[3])
    Table["station.id"] <- i
}
Table

可生产

      V3 station.id
1   8.27  agrin.csv
2   9.11  agrin.csv
3  11.60  agrin.csv
4  15.30  agrin.csv
5  20.53  agrin.csv
6  25.07  agrin.csv
7  27.42  agrin.csv
8  27.11  agrin.csv
9  22.92  agrin.csv
10 17.98  agrin.csv
11 13.15  agrin.csv
12  9.62  agrin.csv
13 17.34  agrin.csv

我想要的是实现一个for循环,它将迭代目录并为上面的每个文件创建一个如上所示的表。

请注意,print(i)行会返回两个结果agrin.csvagr.csv,例如

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

for循环之前,请:

 Table <- data.frame(V3=numeric(0), station.id=character(0))

这称为对象预分配。 然后,在循环中,尝试使用rbind。 使用此方案,您将逐步创建对象

答案 1 :(得分:0)

您没有指定Table$station.id的行索引,因此最后一个值最终会写在整个列上。试试这个:

file.names <- list.files(path = ".", pattern = "\\.csv$")
Table <- data.frame(V3=rep(NA, length(file.names)), 
                    station.id=rep(NA, length(file.names)))
for (i in seq_along(file.names)){
    print(file.names[i])
    f <- read.table(file.names[i], fill=TRUE, row.names=NULL)
    Table[i, "V3"] <- f[3]     ## this only works if f has only one observation.
    Table[i, "station.id"] <- file.names[i]
}
Table