如何使用循环将as.POSXIct应用于多个文件的列

时间:2016-06-17 04:30:51

标签: r

这是我目前使用的代码,用于将as.POSIXct应用于多个文件的date_time列。如果我能在循环中做到这一点,那将使我的生活更轻松。没有为任何文件格式化日期和时间,因此我要做的第一步是格式化date_time列,然后对每个文件执行其他计算。 这是我到目前为止使用的代码。

> set(wd)
> files <- list.files(pattern="*.csv")
> for(i in 1:length(files)) {
  assign(sprintf("a.%02d", i), read.csv(files[i], header=T))
  }
> a.01[,1] <- as.POSIXct(a.01[,1], format="%m/%d/%Y %H:%S")
> a.02[,1] <- as.POSIXct(a.02[,1], format="%m/%d/%Y %H:%S")
> a.03[,1] <- as.POSIXct(a.03[,1], format="%m/%d/%Y %H:%S")
> a.04[,1] <- as.POSIXct(a.04[,1], format="%m/%d/%Y %H:%S")
> a.05[,1] <- as.POSIXct(a.05[,1], format="%m/%d/%Y %H:%S")
> a.06[,1] <- as.POSIXct(a.06[,1], format="%m/%d/%Y %H:%S")
............................................................
and so on. 

我的示例数据看起来像这样。每个文件包含超过3000行和多列。以下结构仅显示其中一个文件的前10行,所有其他文件的格式相同。

> dput(head(a.01, n=10))
structure(list(date_time = structure(c(-61759604476, -61759593676, 
-61759582876, -61759572076, -61759561276, -61759550476, -61759539676, 
-61759528876, -61759518076, -61759507276), class = c("POSIXct", 
"POSIXt"), tzone = ""), V1 = c(1002, 1002, 1002, 
1001, 1000, 1001, 1001, 1002, 1003, 1004), V2 = c(2.228, 
0.7123, 2.67, 4.378, 4.102, 3.782, 1.669, 1.356, 0.3223, 0.2053
), V3 = c(34.48, 8.455, 247.4, 259.8, 276, 333.7, 289.4, 
324, 2.45, 306.9), V4 = c(32.23, 28.6, 31.04, 29.73, 35.24, 
41.17, 37.49, 38.7, 40.8, 36.45), V5 = c(17.55, 
18.55, 21.75, 23.65, 22.15, 19.65, 19.05, 17.25, 16.45, 17.35
)), .Names = c("Date", "V1", "V2", "V3", 
"V4", "V5"), row.names = c(NA, 10L), class = "data.frame")

数据看起来像这样,所有其他文件与未格式化的日期和时间具有相似的模式。

> head(a.01, n=5)
   date_time          V1     V2       V3       V4       V5
1  12-12-01 00:00:00  1002   2.2280   34.480   32.23    17.55
2  12-12-01 03:00:00  1002   0.7123   8.455    28.60    18.55
3  12-12-01 06:00:00  1002   2.6700   247.400  31.04    21.75
4  12-12-01 09:00:00  1001   4.3780   259.800  29.73    23.65
5  12-12-01 12:00:00  1000   4.1020   276.000  35.24    22.15

欢迎任何建议。先感谢您。

2 个答案:

答案 0 :(得分:2)

阅读列表,问题就消失了:

files <- list.files(pattern="*.csv")
a <- lapply(files, function(f) {
  x <- read.csv(f)
  x[,1] = as.POSIXct(x[,1], format="%m/%d/%Y %H:%S")
  x
}
names(a) <- files

答案 1 :(得分:2)

您的日期被错误地阅读。您有"%m/%d/%Y"作为日期格式字符串,它显然应该是:"%m/%d/%y"。如果您将文件的顶部发布为文本而不是R代码创建的内容,则可以获得更明确的答案。我将此作为您结构的输出:

                  Date   V1     V2      V3    V4    V3
1  0012-11-30 10:25:46 1002 2.2280  34.480 32.23 17.55
2  0012-11-30 13:25:46 1002 0.7123   8.455 28.60 18.55

所以你的岁月&#39;被解释为自“共同时代”开始以来的12年。