我有一组形式的赛车运动数据(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中优雅地创建填充差异列?
答案 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
我觉得这个工作到目前为止去。