从.csv文件名循环和提取文件编号并插入到列中

时间:2017-10-17 02:59:11

标签: r csv

我已设法合并来自多个文件的数据,目前正尝试从我的文件中提取文件编号并将其插入到列中。

fnames = dir("../data/temperature_trials", full.names=TRUE)

print(fnames)

for (i in 1: length(fnames) ) {

 #open each file in turn

temp = read.csv(fnames[i])

  if (i == 1) {
    res = temp
  } else {
      res = rbind(res, temp)
    }
}

```

导入12个.csv文件并使用rbind组合所有data.Files命名: Trial1.csv Trial2.csv 。 。 。 Trial12.csv

```
   for (i in 1: length(fnames)) {

loc = regexpr(pattern = "Trial[0-9]*", text = fnames[i])

trialNumber = as.numeric(substr(fnames[i], start = loc[[1]][1]+5,
            stop = loc[[1]][1] + attr(loc, 'match.length')-1))
print(trialNumber)

res1 = cbind(trialNumber, res)

```

我正在尝试从每个.csv文件名中提取试用编号,并将它们放入名为TrialNumber的列中。当我这样做时,它只会为每个数据点在此列中放置一个12。因为它使用循环我假设这是为什么,但无法弄清楚如何解决这个或其他方式这样做。我需要将试用编号分配给与每个.csv文件对应的每个数据点。

2 个答案:

答案 0 :(得分:1)

也许你可以在循环的每次迭代中简单地添加试用号 -

for (i in 1: length(fnames) ) {

#open each file in turn

temp = read.csv(fnames[i])

  if (i == 1) {
    res = temp
  } else {
      res = rbind(res, temp)
    }
res$trial_number=i

}

通过这种方式,您将拥有一个试用号列,该列对应于已导入的文件。

您还可以尝试提取文件名的数字部分,如本答案所述 -

Extract numeric part of strings of mixed numbers and characters in R

答案 1 :(得分:1)

我将使用文件名作为每个列表元素名称的基础,从CSV文件创建数据框列表:

fnames <- list.files("full/path/to/data/temperature_trials", 
                     pattern = "*.csv", full.names = TRUE)
temp   <- lapply(fnames, read.csv)
names(temp) <- tools::file_path_sans_ext(basename(fnames))

然后dplyr::bind_rows()将从列表中创建一个数据框,其中包含.id列中的处理标签:

library(dplyr)
temp_df <- bind_rows(temp, .id = "TrialNumber")