Вот несколько подходов:
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")
Обновление
Добавлена информация о графике выше, поскольку в заголовке вопроса упоминается об этом.