【问题标题】:Use filename to average data by month使用文件名按月平均数据
【发布时间】:2012-05-16 07:39:53
【问题描述】:

我有一个与 R 相关的问题,这与必须读取许多文件并处理这些文件有关。 每个文件用于在不同站点的不同时间进行的臭氧测量。数据是表格格式,我可以使用以下方式读取数据:

files <- list.files()
data  <- lapply(files, read.table, skip=19)

这为我现在要处理的所有文件提供了一个数据框。例如文件被命名为:

> head(files)
 [1] "fiji_19980105.dat" "fiji_19980112.dat" "fiji_19980119.dat"
 [4] "fiji_19980130.dat" "fiji_19980206.dat" "fiji_19980213.dat"

其中“fiji”是电台名称,日期是 YMD 格式。我想对数据框进行平均以获得该站的月平均值(我一次只需要在一个站上工作,所以我真的只想对称为数据的数据框进行平均以产生 12 组平均数据)。

我想我可以使用一些 ?apply 函数来做到这一点,但我真的不知道如何做到这一点。任何关于解决方案的建议都非常感谢!

作为将日期添加到数据框中的结果示例,我们有:

> head(dat)
V1     V2    V3   V4 V5   V6    V7   V8   V9  V10       Date
1 9000 1007.7 0.006 29.6 74 0.59 0.006 9000 9000 9000 1998-01-05
2 9000 1005.2 0.028 29.3 75 0.62 0.006 9000 9000 9000 1998-01-05
3 9000 1001.6 0.060 28.5 78 0.63 0.006 9000 9000 9000 1998-01-05

 > str(dat)
'data.frame':   153994 obs. of  11 variables:
 $ V1  : int  9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 ...
 $ V2  : num  1008 1005 1002 997 993 ...
 $ V3  : num  0.006 0.028 0.06 0.104 0.14 0.169 0.198 0.238 0.271 0.301 ...
 $ V4  : num  29.6 29.3 28.5 27.9 27.6 27.2 27 26.6 26.2 26 ...
 $ V5  : int  74 75 78 79 80 81 82 84 85 85 ...
 $ V6  : num  0.59 0.62 0.63 0.68 0.69 0.7 0.72 0.74 0.75 0.76 ...
 $ V7  : num  0.006 0.006 0.006 0.007 0.007 0.007 0.007 0.008 0.008 0.008 ...
 $ V8  : num  9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 ...
 $ V9  : num  9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 ...
 $ V10 : num  9000 9000 9000 9000 9000 9000 9000 9000 9000 9000 ...
 $ Date: Date, format: "1998-01-05" "1998-01-05" ...

【问题讨论】:

  • 所以你想要每列的平均值?然后聚合而不是点击

标签: r filenames lapply read.table


【解决方案1】:

使用您的文件列表,获取Dates:

datetimes = as.Date(files, "fiji_%Y%m%d")

有关格式模板的详细信息,请参阅?strptime,基本上您可以包含任何其他值作为文字填充符,并忽略任何无关紧要的尾随字符。

其余的要求您提供有关每个 data.frame 中内容的更多信息,因此请向我们提供有关这些数据的更多信息。

最好创建一个大型 data.frame,并将这些日期戳添加到每一行,然后从那里开始。

要得到这样的东西会起作用(想象它被称为“dat”而不是“数据”):

dat = lapply(files, read.table, skip=19)

for (i in 1:length(files)) {
    dat[[i]]$Date = rep(datetimes[i], nrow(dat[[i]])

}

dat = do.call("rbind", dat)

然后,您可以使用format(dat$Date, "%m") 获取每个仅包含月份的日期的值,并使用tapply 使用汇总函数(例如mean)。毫无疑问,很快就会出现这种不那么经典的plyr 版本。 :)

使用 lapply 调用 read.table 可能不是一个好主意,所以我也会更改它,以便您可以对每个 I/O 和 data.frames 的合并进行基本检查。

【讨论】:

  • 谢谢!我刚刚写了一些可怕的东西(使用 4 个 tmp 变量和许多 unlists)来获得日期时间的结果!我没有意识到 R 这么聪明:)
  • 感谢您的示例。恐怕我坚持您使用 tapply 的建议,因为我不太了解它是如何工作的。每个文件可能具有不同的长度。第二个变量是压力,第三个是高度,数据来自发射到天空的气球(不同高度的爆裂声)。我想在最后创建一个数据框或列表列表(不确定优缺点是什么?),其中包含 1 月至 12 月的平均压力、高度和臭氧(V2、V3 和 V7) .感谢您迄今为止的帮助!
  • 不同长度都可以,tapply就是这样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多