【问题标题】:Splitting Dataframe in R, work on with splits and save in new dataframe [duplicate]在R中拆分数据框,使用拆分并保存在新的数据框中[重复]
【发布时间】:2014-01-07 01:31:56
【问题描述】:

我对 R 很陌生,遇到以下问题:

我使用气象数据(温度和降水)。这些数据在我们一年多的时间里每半年进行一次量化。所以我有一个大约 17520 行的数据框。 我的第一列内容形式为:"year-month-day hour:minute:second"

现在我想每天只为我的参数获取一个值,这意味着我需要每天取平均值。

我设法使用以下表达式按日期拆分数据框:

split(data, as.Date(data$DATE))

但现在我有一个问题,我不知道如何处理该拆分。如果我想保存它,我只会得到某种列表。 有谁知道,我如何处理我的拆分数据,这意味着,我如何平均每天的值并将平均的日值合并到一个新的数据框中,该数据框只包含一年中的每一天的一行。

我希望我对问题的描述已经足够充分。 提前感谢您的回答!

【问题讨论】:

  • 在这里查看约书亚的回答:stackoverflow.com/questions/17658274/…
  • 谢谢,这真的很有帮助;-)
  • EDi 的链接非常适合对时间序列数据执行此操作。更通用的版本是在 plyr 包中实现的 split-apply-combine 方法(尽管这不是唯一的方法;你有分割部分,lapply 可以给你 apply-over-each-partition-of -the-split 部分,rbind(或一些变体)可以重新组合它们。

标签: r time-series


【解决方案1】:

一般如链接中所述,xts 是处理时间序列的好包。另一种选择是使用data.table 包。这里我比较了 2 个包的性能计算时间序列的每日平均值。

## needed package
library(data.table)
library(xts)
library(microbenchmark)
## create the data, here I am using yearly index with half an hour frequency
set.seed(1)
time = seq.POSIXt(from=as.POSIXct('2013-01-01',tz=''),
                  to=as.POSIXct('2013-12-31',tz=''),
                  by = as.difftime(0.5,units="hours"))
value= runif(n = length(time), min = 18, max = 54)
## the data.table object
DT <- data.table(time=time,value=value)
## the time series
xtt <- xts(x=value,time)

我使用 data.table 和 xts 计算每日平均值。对于 data.table,我使用 2 种方法:第一种方法创建分组因子 (day),第二种方法使用已经创建的分组因子。

## compute daily mean using data.table
dt.m <- function()
  DT[,day:=format(time,'%d-%m-%Y')][,mean(value),day]
## using data.table but the grouping variable is already created
dt.withday.m <- function()
  DT[,mean(value),day]
## daily mean using time series
xts.m <- function()
  xtt.d <- apply.daily(xtt,mean)
## benchmark
microbenchmark(dt.m(),xts.m(),dt.withday.m,times=5,unit='ms')


Unit: milliseconds
         expr       min        lq     median         uq        max neval
       dt.m() 159.36342 160.71548 161.628732 162.527193 171.672999     5
      xts.m() 206.63565 207.90692 208.210708 214.023594 225.322446     5
 dt.withday.m   0.00038   0.00038   0.001138   0.001139   0.001518     5

所以这两种方法的性能几乎相同。但是一旦我们创建了分组因子(dt.withday.m),我们就会显着提高性能。所以如果你必须做其他日常总结,使用data.table是最好的选择。

另一点是rolling 平均值或在给定宽度时间窗口内计算平均值。据我所知,我认为 xts 在滚动平均值方面是无与伦比的:

  xtt.r <- rollapply(xtt,width=2,FUN=mean)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多