【问题标题】:R: Read multiple files and label them based on the file nameR:读取多个文件并根据文件名标记它们
【发布时间】:2015-03-12 08:05:35
【问题描述】:

我有一个包含大约 400 个具有相同结构的文件的文件夹。这些文件中的每一个都包含 4 个没有标题的列,对应于 4 个气候变量。我需要根据文件名在每个文件中包含两个新列。名称的结构是 MeteoData_PXCY,其中 X=CODE_PLOT 和 Y=CODE_COUNTRY。一旦我有了这两个新列,我需要读取一个数据集中的所有文件,并按CODE_PLOTCODE_COUNTRY 聚合分组以计算平均值。因此,最终输出为 400 行,CODE_PLOTCODE_COUNTRY 各一行。

示例文件 MeteoData_P1C1.csv

32509   33.91   2.9155  4494.5  13.46
32540   63.03   3.9718  6520.8  25.12
32568   71.68   8.7874  11587   58.67
32599   116.38  7.8683  13286   62.58
32629   31.12   16.097  23555   135.35
32660   56.56   16.481  21886   130.24
32690   68.59   19.737  21677   141.15
32721   55.55   18.755  18830   117.39
32752   59.88   15.598  13579   81.06
32782   43.43   12.361  8622.2  54.57

MeteoData_P109C19.csv 示例

32509   18.17   -0.70355    1413.5  9.93
32540   78  -0.43607    3574.6  10.46
32568   74.43   0.38645 7478.5  22.53
32599   73.19   2.5743  12352   42.85
32629   36.75   9.4852  21244   105.57
32660   61.65   13.753  21586   117.3
32690   86.16   15.991  20452   127.89
32721   98.02   12.713  13981   76.73
32752   32.14   9.9547  10850   53.13
32782   53.46   4.4252  5041.7  21.46

在最终输出中我应该有这个结构(没有“;”):

Date; Precip; Temp; Rad; Pet; CODE_PLOT; CODE_COUNTRY
32540; 63.03; 3.9718; 6520.8; 25.12; 1; 1
32568; 71.68; 8.7874; 11587; 58.67; 9; 19

目前,我有:

setwd("MeteoData”) # Folder in which all the files are into
filenames <- list.files(pattern=".csv")
clim <- lapply(filenames, function(x) read.csv(file=x, header=FALSE))

【问题讨论】:

  • 嗯,你试过什么?
  • 我知道如何读取文件夹中的所有文件,但不知道如何根据文件名标记它们
  • 请添加您已有的代码
  • 帖子中添加的代码
  • 虽然 lapply 通常是一个好主意,但在这种情况下,循环将是首选,因为您需要操纵单个文件名以获得 C 和 P 值(请参阅我的答案)。

标签: r


【解决方案1】:

您可以将所有文件放在一个新文件夹/目录中,然后使用 list.files 创建一个循环:

all.dfs <- list()
for(filename in list.files("some_dir")) {
   all.dfs[[length(all.dfs) + 1]] <- read.table(filename, ...) 
   # put in read.table call the appropriate arguments, including column names for the existing data in the files
   all.dfs[[length(all.dfs)]]$CODE_PLOT <- sub(".*P(\\d*)C(\\d*)\\.csv", "\\1", filename)
   all.dfs[[length(all.dfs)]]$CODE_COUNTRY <- sub(".*P(\\d*)C(\\d*)\\.csv", "\\2", filename)
}

然后将所有内容合并到一个数据帧中...

big.df <- do.call(rbind, all.dfs)

尚未测试,但请随时在评论中提问。

【讨论】:

  • &gt; all.dfs &lt;- list() &gt; for(filename in list.files("MeteoData")) { + all.dfs[[length(all.dfs) + 1]] &lt;- read.csv(filename,col.names=c("Date","Precip","Temp","Rad","Pet")) + # put in read.table call the appropriate arguments, including column names for the existing data in the files + all.dfs[[length(all.dfs)]]$CODE_PLOT &lt;- sub(".*P(\\d*)C(\\d*)\\.csv", "\\1", filename) + all.dfs[[length(all.dfs)]]$CODE_COUNTRY &lt;- sub(".*P(\\d*)C(\\d*)\\.csv", "\\2", filename) + }
  • 文件中的错误(文件,“rt”):无法打开连接另外:警告消息:在文件(文件,“rt”)中:无法打开文件'MeteoData_P100C175.csv':没有这样文件或目录
  • 您是否使用set.wd() 将R 的目录更改为适当的位置?然后你会使用 list.files(".")
  • 我没有。但是我检查了这个,所以我假设目录是否正常?:
  • &gt; test &lt;- list.files("MeteoData") &gt; str(test) chr [1:438] "MeteoData_P100C175.csv" "MeteoData_P101C18.csv" "MeteoData_P102C18.csv" ... &gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2020-07-01
  • 2016-06-14
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
相关资源
最近更新 更多