创建增量列以绘制R中的时间序列差异

时间:2011-09-26 08:15:06

标签: r

我有一组形式的赛车运动数据(mld):

  car lap laptime
1  1   1 138.523
2  1   2 122.373
3  1   3 121.395
4  1   4 137.871

我想制作一些形式的东西:

  lap  car.1    car.1.delta   
1  1   138       NA
2  2   122       -16  
3  3   121       -1  
4  4   127       6

我可以使用R命令diff(mld $ laptime,lag = 1)来生成差异列,但是如何在R中优雅地创建填充差异列?

2 个答案:

答案 0 :(得分:10)

以下是两种方法:

1)动物园

如果我们使用动物园将其表示为时间序列,那么计算将非常简单:

# test data with two cars

Lines <- "car lap laptime
1   1 138.523
1   2 122.373
1   3 121.395
1   4 137.871
2   1 138.523
2   2 122.373
2   3 121.395
2   4 137.871"
cat(Lines, "\n", file = "data.txt")

# read it into a zoo series, splitting it
# on car to give wide form (rather than long form)

library(zoo)
z <- read.zoo("data.txt", header = TRUE, split = 1, index = 2, FUN = as.numeric)

# now that its in the right form its simple

zz <- cbind(z, diff(z))

最后一句话给出:

> zz
      1.z     2.z 1.diff(z) 2.diff(z)
1 138.523 138.523        NA        NA
2 122.373 122.373   -16.150   -16.150
3 121.395 121.395    -0.978    -0.978
4 137.871 137.871    16.476    16.476

要为zz绘制每个面板一列,请尝试以下操作:

plot(zz, type = "o")

要仅绘制差异,我们首先不需要zz,因为这样做:

plot(diff(z), type = "o")

(将screen=1参数添加到plot命令以在同一面板上绘制所有内容。)

2) ave 。这是第二种解决方案,它只使用普通R(绘图除外)并保持输出的长形式;但是,它有点复杂:

# assume same input as above

DF <- read.table("data.txt", header = TRUE)
DF$diff <- ave(DF$laptime, DF$car, FUN = function(x) c(NA, diff(x)))

结果是:

> DF
  car lap laptime    diff
1   1   1 138.523      NA
2   1   2 122.373 -16.150
3   1   3 121.395  -0.978
4   1   4 137.871  16.476
5   2   1 138.523      NA
6   2   2 122.373 -16.150
7   2   3 121.395  -0.978
8   2   4 137.871  16.476

要仅绘制差异,每个面板一个,请尝试:

library(lattice)
xyplot(diff ~ lap | car, DF, type = "o")

<强>更新

上面添加了关于绘图的信息,因为问题的标题提到了这一点。

答案 1 :(得分:3)

我认为这已经足够了:

mld$car.1.delta = c(NA, diff(mld$laptime, lag = 1))

在你的例子中,你截断了laptimes但是舍入car.1.delta,所以如果你真的取决于你希望它如何工作,但是下面的代码给出了你发布的内容。

with中的所有内容包装起来以简化,并根据现有列的修改创建新的data.frame。将NA添加到diff以填充它。

with(mld, 
    data.frame(
        lap = lap, 
    car.1 = trunc(laptime), 
    car.1.delta = c(NA, round(diff(laptime)))
)
)

  lap car.1 car.1.delta
1   1   138          NA
2   2   122         -16
3   3   121          -1
4   4   137          16

我想知道你是否想要这样做by汽车,如果是这样的话需要更多的处理,但是因为你真的要求列car.1我觉得这个工作到目前为止去。