Создание дельта-столбца для отображения различий временных рядов в R - PullRequest
4 голосов
/ 26 сентября 2011

У меня есть набор данных о времени прохождения автоспорта (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 ]

10 голосов
/ 26 сентября 2011

Вот несколько подходов:

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) пр. . Вот второе решение, которое использует просто 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")

Обновление

Добавлена ​​информация о графике выше, поскольку в заголовке вопроса упоминается об этом.

3 голосов
/ 26 сентября 2011

Я думаю, что этого достаточно:

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

В вашем примере у вас есть сокращенные промежутки времени, но округленные 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 Я думаю, что это пока работаеткак это идет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...