-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathz3_manipulate.html
More file actions
461 lines (431 loc) · 42.3 KB
/
z3_manipulate.html
File metadata and controls
461 lines (431 loc) · 42.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
<!DOCTYPE html>
<!-- Generated by pkgdown: do not edit by hand --><html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="trackdf">
<title>3 - Manipulating a track table • trackdf</title>
<!-- favicons --><link rel="icon" type="image/png" sizes="16x16" href="../favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="../favicon-32x32.png">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="../apple-touch-icon.png">
<link rel="apple-touch-icon" type="image/png" sizes="120x120" href="../apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" type="image/png" sizes="76x76" href="../apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" type="image/png" sizes="60x60" href="../apple-touch-icon-60x60.png">
<script src="../deps/jquery-3.6.0/jquery-3.6.0.min.js"></script><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link href="../deps/bootstrap-5.2.2/bootstrap.min.css" rel="stylesheet">
<script src="../deps/bootstrap-5.2.2/bootstrap.bundle.min.js"></script><!-- Font Awesome icons --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css" integrity="sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css" integrity="sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=" crossorigin="anonymous">
<!-- bootstrap-toc --><script src="https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js" integrity="sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=" crossorigin="anonymous"></script><!-- headroom.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js" integrity="sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js" integrity="sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=" crossorigin="anonymous"></script><!-- clipboard.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js" integrity="sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=" crossorigin="anonymous"></script><!-- search --><script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js" integrity="sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js" integrity="sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js" integrity="sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==" crossorigin="anonymous"></script><!-- pkgdown --><script src="../pkgdown.js"></script><meta property="og:title" content="3 - Manipulating a track table">
<meta property="og:description" content="trackdf">
<meta property="og:image" content="https://swarm-lab.github.io/trackdf/logo.svg">
<!-- mathjax --><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js" integrity="sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js" integrity="sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=" crossorigin="anonymous"></script><!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<a href="#main" class="visually-hidden-focusable">Skip to contents</a>
<nav class="navbar fixed-top navbar-light navbar-expand-lg bg-light"><div class="container">
<a class="navbar-brand me-2" href="../index.html">trackdf</a>
<small class="nav-text text-muted me-auto" data-bs-toggle="tooltip" data-bs-placement="bottom" title="">0.3.2</small>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div id="navbar" class="collapse navbar-collapse ms-3">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="../reference/index.html">Reference</a>
</li>
<li class="active nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" role="button" aria-expanded="false" aria-haspopup="true" id="dropdown-articles">Articles</a>
<div class="dropdown-menu" aria-labelledby="dropdown-articles">
<a class="dropdown-item" href="../articles/z1_install.html">1 - Installing trackdf</a>
<a class="dropdown-item" href="../articles/z2_build.html">2 - Building a track table</a>
<a class="dropdown-item" href="../articles/z3_manipulate.html">3 - Manipulating a track table</a>
<a class="dropdown-item" href="../articles/z4_errors.html">4 - Detecting errors</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" href="../news/index.html">Changelog</a>
</li>
</ul>
<form class="form-inline my-2 my-lg-0" role="search">
<input type="search" class="form-control me-sm-2" aria-label="Toggle navigation" name="search-input" data-search-index="../search.json" id="search-input" placeholder="Search for" autocomplete="off">
</form>
<ul class="navbar-nav">
<li class="nav-item">
<a class="external-link nav-link" href="https://github.com/swarm-lab/trackdf/" aria-label="github">
<span class="fab fa fab fa-github fa-lg"></span>
</a>
</li>
</ul>
</div>
</div>
</nav><div class="container template-article">
<div class="row">
<main id="main" class="col-md-9"><div class="page-header">
<img src="../logo.svg" class="logo" alt=""><h1>3 - Manipulating a track table</h1>
<h4 data-toc-skip class="author">Simon
Garnier</h4>
<small class="dont-index">Source: <a href="https://github.com/swarm-lab/trackdf/blob/HEAD/vignettes/z3_manipulate.Rmd" class="external-link"><code>vignettes/z3_manipulate.Rmd</code></a></small>
<div class="d-none name"><code>z3_manipulate.Rmd</code></div>
</div>
<p>Under the hood, a track table is a data frame with a few extra bells
and whistles. Therefore, you can manipulate a track table in the same
way you would a <code><a href="https://rdrr.io/r/base/data.frame.html" class="external-link">base::data.frame</a></code>,
<code><a href="https://tibble.tidyverse.org/reference/tibble.html" class="external-link">tibble::tibble</a></code>, or <code><a href="https://Rdatatable.gitlab.io/data.table/reference/data.table.html" class="external-link">data.table::data.table</a></code>
(depending on the data frame class you used as a base for your track
table). Anything that you can do with one of these three data frame
classes can be done the same way with a track table.</p>
<p>There are, however, a few additional things that are specific to
track tables and we will review them in this vignette.</p>
<p>But first, let’s load a track table that is provided with
<code>trackdf</code>:</p>
<div class="sourceCode" id="cb1"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="kw"><a href="https://rdrr.io/r/base/library.html" class="external-link">library</a></span><span class="op">(</span><span class="va"><a href="https://swarm-lab.github.io/trackdf/">trackdf</a></span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## </span></span>
<span><span class="co">## Attaching package: 'trackdf'</span></span></code></pre>
<pre><code><span><span class="co">## The following object is masked from 'package:stats':</span></span>
<span><span class="co">## </span></span>
<span><span class="co">## filter</span></span></code></pre>
<div class="sourceCode" id="cb4"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="https://rdrr.io/r/utils/data.html" class="external-link">data</a></span><span class="op">(</span><span class="st">"tracks"</span><span class="op">)</span></span>
<span><span class="fu"><a href="https://rdrr.io/r/base/print.html" class="external-link">print</a></span><span class="op">(</span><span class="va">tracks</span>, max <span class="op">=</span> <span class="fl">10</span> <span class="op">*</span> <span class="fu"><a href="https://rdrr.io/r/base/nrow.html" class="external-link">ncol</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Track table [7195 observations]</span></span>
<span><span class="co">## Number of tracks: 2 </span></span>
<span><span class="co">## Dimensions: 2D </span></span>
<span><span class="co">## Geographic: TRUE </span></span>
<span><span class="co">## Projection: +proj=longlat </span></span>
<span><span class="co">## Table class: data frame ('data.frame')</span></span>
<span><span class="co">## id t x y</span></span>
<span><span class="co">## 1 1 2015-09-10 07:00:00 15.76468 -22.37957</span></span>
<span><span class="co">## 2 1 2015-09-10 07:00:01 15.76468 -22.37957</span></span>
<span><span class="co">## 3 1 2015-09-10 07:00:04 15.76468 -22.37958</span></span>
<span><span class="co">## 4 1 2015-09-10 07:00:05 15.76468 -22.37958</span></span>
<span><span class="co">## 5 1 2015-09-10 07:00:08 15.76467 -22.37959</span></span>
<span><span class="co">## 6 1 2015-09-10 07:00:09 15.76467 -22.37959</span></span>
<span><span class="co">## 7 1 2015-09-10 07:00:09 15.76467 -22.37959</span></span>
<span><span class="co">## 8 1 2015-09-10 07:00:10 15.76467 -22.37959</span></span>
<span><span class="co">## 9 1 2015-09-10 07:00:11 15.76467 -22.37959</span></span>
<span><span class="co">## 10 1 2015-09-10 07:00:12 15.76467 -22.37959</span></span>
<span><span class="co">## [ reached 'max' / getOption("max.print") -- omitted 7185 rows ]</span></span></code></pre>
<p>This track table contains the GPS coordinates of two goats foraging
through the Tsaobis Nature Park in Namibia, sometimes in 2015.</p>
<hr>
<div class="section level2">
<h2 id="basic-information-about-the-track-table">3.1 - Basic information about the track table<a class="anchor" aria-label="anchor" href="#basic-information-about-the-track-table"></a>
</h2>
<p>In addition to the usual information that you can ask about a data
frame (e.g., the number of rows and columns, the class of each column,
etc), you can access additional information about the content of a track
table.</p>
<p>First, you can check whether an object is indeed a track table as
follows:</p>
<div class="sourceCode" id="cb6"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="../reference/is_track.html">is_track</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## [1] TRUE</span></span></code></pre>
<p>You can also check whether the track table contains geographic
coordinates or not as follows:</p>
<div class="sourceCode" id="cb8"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="../reference/is_geo.html">is_geo</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## [1] TRUE</span></span></code></pre>
<p>You can find out the number of different tracks included in the track
table as follows:</p>
<div class="sourceCode" id="cb10"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="../reference/n_tracks.html">n_tracks</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## [1] 2</span></span></code></pre>
<p>Finally, you can retrieve the dimensionality (2D or 3D) of the track
table as follows:</p>
<div class="sourceCode" id="cb12"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="../reference/n_dims.html">n_dims</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## [1] 2</span></span></code></pre>
<hr>
</div>
<div class="section level2">
<h2 id="accessing-data">3.2 - Accessing data<a class="anchor" aria-label="anchor" href="#accessing-data"></a>
</h2>
<p>Accessing and modifying the different parts (rows, columns, elements)
of a track table is similar to accessing and modifying the different
parts of the underlying data frame. We will, therefore, not discuss this
topic further as it is something that you should already be very familar
with.</p>
<p>Note, however, that different data frame classes may do thing
slightly differently from each other. Make sure to know what class is
used with the track tables you are working with. For instance, the track
table that we loaded for this tutorial if of class
<code>data.frame</code>, as indicated in the 6th line of the print out
of the track table:</p>
<div class="sourceCode" id="cb14"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="https://rdrr.io/r/base/print.html" class="external-link">print</a></span><span class="op">(</span><span class="va">tracks</span>, max <span class="op">=</span> <span class="fl">10</span> <span class="op">*</span> <span class="fu"><a href="https://rdrr.io/r/base/nrow.html" class="external-link">ncol</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Track table [7195 observations]</span></span>
<span><span class="co">## Number of tracks: 2 </span></span>
<span><span class="co">## Dimensions: 2D </span></span>
<span><span class="co">## Geographic: TRUE </span></span>
<span><span class="co">## Projection: +proj=longlat </span></span>
<span><span class="co">## Table class: data frame ('data.frame')</span></span>
<span><span class="co">## id t x y</span></span>
<span><span class="co">## 1 1 2015-09-10 07:00:00 15.76468 -22.37957</span></span>
<span><span class="co">## 2 1 2015-09-10 07:00:01 15.76468 -22.37957</span></span>
<span><span class="co">## 3 1 2015-09-10 07:00:04 15.76468 -22.37958</span></span>
<span><span class="co">## 4 1 2015-09-10 07:00:05 15.76468 -22.37958</span></span>
<span><span class="co">## 5 1 2015-09-10 07:00:08 15.76467 -22.37959</span></span>
<span><span class="co">## 6 1 2015-09-10 07:00:09 15.76467 -22.37959</span></span>
<span><span class="co">## 7 1 2015-09-10 07:00:09 15.76467 -22.37959</span></span>
<span><span class="co">## 8 1 2015-09-10 07:00:10 15.76467 -22.37959</span></span>
<span><span class="co">## 9 1 2015-09-10 07:00:11 15.76467 -22.37959</span></span>
<span><span class="co">## 10 1 2015-09-10 07:00:12 15.76467 -22.37959</span></span>
<span><span class="co">## [ reached 'max' / getOption("max.print") -- omitted 7185 rows ]</span></span></code></pre>
<hr>
</div>
<div class="section level2">
<h2 id="accessing-the-projection-information-of-a-track-table">3.3 - Accessing the projection information of a track table<a class="anchor" aria-label="anchor" href="#accessing-the-projection-information-of-a-track-table"></a>
</h2>
<p>One particularity of track tables over regular data frames is that
they can store geographic data explicitly and perform projection
operations to change their coordinate reference system if necessary.</p>
<p>In order to access the coordinate reference system (or projection) of
a track table containing geographic data, you simply need to execute the
following command:</p>
<div class="sourceCode" id="cb16"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="../reference/projection.html">projection</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Coordinate Reference System:</span></span>
<span><span class="co">## User input: +proj=longlat </span></span>
<span><span class="co">## wkt:</span></span>
<span><span class="co">## GEOGCRS["unknown",</span></span>
<span><span class="co">## DATUM["World Geodetic System 1984",</span></span>
<span><span class="co">## ELLIPSOID["WGS 84",6378137,298.257223563,</span></span>
<span><span class="co">## LENGTHUNIT["metre",1]],</span></span>
<span><span class="co">## ID["EPSG",6326]],</span></span>
<span><span class="co">## PRIMEM["Greenwich",0,</span></span>
<span><span class="co">## ANGLEUNIT["degree",0.0174532925199433],</span></span>
<span><span class="co">## ID["EPSG",8901]],</span></span>
<span><span class="co">## CS[ellipsoidal,2],</span></span>
<span><span class="co">## AXIS["longitude",east,</span></span>
<span><span class="co">## ORDER[1],</span></span>
<span><span class="co">## ANGLEUNIT["degree",0.0174532925199433,</span></span>
<span><span class="co">## ID["EPSG",9122]]],</span></span>
<span><span class="co">## AXIS["latitude",north,</span></span>
<span><span class="co">## ORDER[2],</span></span>
<span><span class="co">## ANGLEUNIT["degree",0.0174532925199433,</span></span>
<span><span class="co">## ID["EPSG",9122]]]]</span></span></code></pre>
<p>This returns an object of class <code>crs</code> which is a list
consisting of an <code>input</code> object (usually the character string
that you have entered in <code>track</code> under the <code>proj</code>
parameter), and a <code>wkt</code> object which is an automatically
generated <a href="https://en.wikipedia.org/wiki/Well-known_text_representation_of_coordinate_reference_systems" class="external-link">WKT
2</a> representation of the coordinate reference system.</p>
<p>You can modify in place the projection of a track table as follows.
This will automatically convert the x and y coordinates contained in the
track table to the appropriate projection system:</p>
<div class="sourceCode" id="cb18"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="../reference/projection.html">projection</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span> <span class="op"><-</span> <span class="st">"+proj=somerc +lat_0=46.9524056 +lon_0=7.43958333 +ellps=bessel +x_0=2600000 +y_0=1200000 +towgs84=674.374,15.056,405.346 +units=m +k_0=1 +no_defs"</span></span>
<span><span class="fu"><a href="https://rdrr.io/r/base/print.html" class="external-link">print</a></span><span class="op">(</span><span class="va">tracks</span>, max <span class="op">=</span> <span class="fl">10</span> <span class="op">*</span> <span class="fu"><a href="https://rdrr.io/r/base/nrow.html" class="external-link">ncol</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Track table [7195 observations]</span></span>
<span><span class="co">## Number of tracks: 2 </span></span>
<span><span class="co">## Dimensions: 2D </span></span>
<span><span class="co">## Geographic: TRUE </span></span>
<span><span class="co">## Projection: +proj=somerc +lat_0=46.9524056 +lon_0=7.43958333 +ellps=bessel +x_0=2600000 +y_0=1200000 +towgs84=674.374,15.056,405.346 +units=m +k_0=1 +no_defs </span></span>
<span><span class="co">## Table class: data frame ('data.frame')</span></span>
<span><span class="co">## id t x y</span></span>
<span><span class="co">## 1 1 2015-09-10 07:00:00 4927487 -9217299</span></span>
<span><span class="co">## 2 1 2015-09-10 07:00:01 4927487 -9217299</span></span>
<span><span class="co">## 3 1 2015-09-10 07:00:04 4927487 -9217301</span></span>
<span><span class="co">## 4 1 2015-09-10 07:00:05 4927487 -9217302</span></span>
<span><span class="co">## 5 1 2015-09-10 07:00:08 4927486 -9217304</span></span>
<span><span class="co">## 6 1 2015-09-10 07:00:09 4927485 -9217305</span></span>
<span><span class="co">## 7 1 2015-09-10 07:00:09 4927485 -9217305</span></span>
<span><span class="co">## 8 1 2015-09-10 07:00:10 4927485 -9217306</span></span>
<span><span class="co">## 9 1 2015-09-10 07:00:11 4927485 -9217306</span></span>
<span><span class="co">## 10 1 2015-09-10 07:00:12 4927485 -9217306</span></span>
<span><span class="co">## [ reached 'max' / getOption("max.print") -- omitted 7185 rows ]</span></span></code></pre>
<p>And back to the original projection:</p>
<div class="sourceCode" id="cb20"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="fu"><a href="../reference/projection.html">projection</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span> <span class="op"><-</span> <span class="st">"+proj=longlat"</span> </span>
<span><span class="fu"><a href="https://rdrr.io/r/base/print.html" class="external-link">print</a></span><span class="op">(</span><span class="va">tracks</span>, max <span class="op">=</span> <span class="fl">10</span> <span class="op">*</span> <span class="fu"><a href="https://rdrr.io/r/base/nrow.html" class="external-link">ncol</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Track table [7195 observations]</span></span>
<span><span class="co">## Number of tracks: 2 </span></span>
<span><span class="co">## Dimensions: 2D </span></span>
<span><span class="co">## Geographic: TRUE </span></span>
<span><span class="co">## Projection: +proj=longlat </span></span>
<span><span class="co">## Table class: data frame ('data.frame')</span></span>
<span><span class="co">## id t x y</span></span>
<span><span class="co">## 1 1 2015-09-10 07:00:00 15.76468 -22.37957</span></span>
<span><span class="co">## 2 1 2015-09-10 07:00:01 15.76468 -22.37957</span></span>
<span><span class="co">## 3 1 2015-09-10 07:00:04 15.76468 -22.37958</span></span>
<span><span class="co">## 4 1 2015-09-10 07:00:05 15.76468 -22.37958</span></span>
<span><span class="co">## 5 1 2015-09-10 07:00:08 15.76467 -22.37959</span></span>
<span><span class="co">## 6 1 2015-09-10 07:00:09 15.76467 -22.37959</span></span>
<span><span class="co">## 7 1 2015-09-10 07:00:09 15.76467 -22.37959</span></span>
<span><span class="co">## 8 1 2015-09-10 07:00:10 15.76466 -22.37959</span></span>
<span><span class="co">## 9 1 2015-09-10 07:00:11 15.76466 -22.37959</span></span>
<span><span class="co">## 10 1 2015-09-10 07:00:12 15.76466 -22.37959</span></span>
<span><span class="co">## [ reached 'max' / getOption("max.print") -- omitted 7185 rows ]</span></span></code></pre>
<p>If you prefer not to modify the original object, you can create a new
one with the new projection using the<code>project</code> function as
follows:</p>
<div class="sourceCode" id="cb22"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="va">tracks_somerc</span> <span class="op"><-</span> <span class="fu"><a href="../reference/projection.html">project</a></span><span class="op">(</span><span class="va">tracks</span>, <span class="st">"+proj=somerc +lat_0=46.9524056 +lon_0=7.43958333 +ellps=bessel +x_0=2600000 +y_0=1200000 +towgs84=674.374,15.056,405.346 +units=m +k_0=1 +no_defs"</span><span class="op">)</span></span>
<span><span class="fu"><a href="https://rdrr.io/r/base/print.html" class="external-link">print</a></span><span class="op">(</span><span class="va">tracks_somerc</span>, max <span class="op">=</span> <span class="fl">10</span> <span class="op">*</span> <span class="fu"><a href="https://rdrr.io/r/base/nrow.html" class="external-link">ncol</a></span><span class="op">(</span><span class="va">tracks</span><span class="op">)</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Track table [7195 observations]</span></span>
<span><span class="co">## Number of tracks: 2 </span></span>
<span><span class="co">## Dimensions: 2D </span></span>
<span><span class="co">## Geographic: TRUE </span></span>
<span><span class="co">## Projection: +proj=somerc +lat_0=46.9524056 +lon_0=7.43958333 +ellps=bessel +x_0=2600000 +y_0=1200000 +towgs84=674.374,15.056,405.346 +units=m +k_0=1 +no_defs </span></span>
<span><span class="co">## Table class: data frame ('data.frame')</span></span>
<span><span class="co">## id t x y</span></span>
<span><span class="co">## 1 1 2015-09-10 07:00:00 4927487 -9217299</span></span>
<span><span class="co">## 2 1 2015-09-10 07:00:01 4927487 -9217299</span></span>
<span><span class="co">## 3 1 2015-09-10 07:00:04 4927487 -9217301</span></span>
<span><span class="co">## 4 1 2015-09-10 07:00:05 4927487 -9217302</span></span>
<span><span class="co">## 5 1 2015-09-10 07:00:08 4927486 -9217304</span></span>
<span><span class="co">## 6 1 2015-09-10 07:00:09 4927485 -9217305</span></span>
<span><span class="co">## 7 1 2015-09-10 07:00:09 4927485 -9217305</span></span>
<span><span class="co">## 8 1 2015-09-10 07:00:10 4927485 -9217306</span></span>
<span><span class="co">## 9 1 2015-09-10 07:00:11 4927485 -9217306</span></span>
<span><span class="co">## 10 1 2015-09-10 07:00:12 4927485 -9217306</span></span>
<span><span class="co">## [ reached 'max' / getOption("max.print") -- omitted 7185 rows ]</span></span></code></pre>
<hr>
</div>
<div class="section level2">
<h2 id="combining-track-tables">3.4 - Combining track tables<a class="anchor" aria-label="anchor" href="#combining-track-tables"></a>
</h2>
<p>Combining track tables requires a bit of caution. Indeed, traditional
methods to combine data frames (e.g., <code><a href="https://rdrr.io/r/base/cbind.html" class="external-link">base::rbind</a></code>,
<code><a href="https://Rdatatable.gitlab.io/data.table/reference/rbindlist.html" class="external-link">data.table::rbindlist</a></code>, or <code><a href="https://dplyr.tidyverse.org/reference/bind_rows.html" class="external-link">dplyr::bind_rows</a></code>)
will successfully bind together multiple track tables but they will not
check whether these track tables are compatible with each other. For
instance, they will not check that the coordinates are using the same
coordinate reference system or that the time stamps are all in the same
time zone.</p>
<p>In order to ensure that different track tables can be combined
without creating problems down the analysis pipeline,
<code>trackdf</code> provides its own method to bind multiple track
tables together: <code>bind_tracks</code>.</p>
<p>To demonstrate how <code>bind_tracks</code> works, let’s first create
3 track tables, 2 that are compatible with each other, and 1 that is
not.</p>
<div class="sourceCode" id="cb24"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="va">raw1</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/utils/read.table.html" class="external-link">read.csv</a></span><span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/system.file.html" class="external-link">system.file</a></span><span class="op">(</span><span class="st">"extdata/gps/02.csv"</span>, package <span class="op">=</span> <span class="st">"trackdf"</span><span class="op">)</span><span class="op">)</span></span>
<span><span class="va">raw2</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/utils/read.table.html" class="external-link">read.csv</a></span><span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/system.file.html" class="external-link">system.file</a></span><span class="op">(</span><span class="st">"extdata/gps/03.csv"</span>, package <span class="op">=</span> <span class="st">"trackdf"</span><span class="op">)</span><span class="op">)</span></span>
<span><span class="va">raw3</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/utils/read.table.html" class="external-link">read.csv</a></span><span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/system.file.html" class="external-link">system.file</a></span><span class="op">(</span><span class="st">"extdata/video/01.csv"</span>, package <span class="op">=</span> <span class="st">"trackdf"</span><span class="op">)</span><span class="op">)</span></span>
<span></span>
<span><span class="va">track1</span> <span class="op"><-</span> <span class="fu"><a href="../reference/track_.html">track</a></span><span class="op">(</span>x <span class="op">=</span> <span class="va">raw1</span><span class="op">$</span><span class="va">lon</span>, y <span class="op">=</span> <span class="va">raw1</span><span class="op">$</span><span class="va">lat</span>, t <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/paste.html" class="external-link">paste</a></span><span class="op">(</span><span class="va">raw1</span><span class="op">$</span><span class="va">date</span>, <span class="va">raw1</span><span class="op">$</span><span class="va">time</span><span class="op">)</span>, </span>
<span> id <span class="op">=</span> <span class="fl">1</span>, proj <span class="op">=</span> <span class="st">"+proj=longlat"</span>, tz <span class="op">=</span> <span class="st">"Africa/Windhoek"</span><span class="op">)</span></span>
<span><span class="va">track2</span> <span class="op"><-</span> <span class="fu"><a href="../reference/track_.html">track</a></span><span class="op">(</span>x <span class="op">=</span> <span class="va">raw2</span><span class="op">$</span><span class="va">lon</span>, y <span class="op">=</span> <span class="va">raw2</span><span class="op">$</span><span class="va">lat</span>, t <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/paste.html" class="external-link">paste</a></span><span class="op">(</span><span class="va">raw2</span><span class="op">$</span><span class="va">date</span>, <span class="va">raw2</span><span class="op">$</span><span class="va">time</span><span class="op">)</span>, </span>
<span> id <span class="op">=</span> <span class="fl">2</span>, proj <span class="op">=</span> <span class="st">"+proj=longlat"</span>, tz <span class="op">=</span> <span class="st">"Africa/Windhoek"</span><span class="op">)</span></span>
<span><span class="va">track3</span> <span class="op"><-</span> <span class="fu"><a href="../reference/track_.html">track</a></span><span class="op">(</span>x <span class="op">=</span> <span class="va">raw3</span><span class="op">$</span><span class="va">x</span>, y <span class="op">=</span> <span class="va">raw3</span><span class="op">$</span><span class="va">y</span>, t <span class="op">=</span> <span class="va">raw3</span><span class="op">$</span><span class="va">frame</span>, id <span class="op">=</span> <span class="va">raw3</span><span class="op">$</span><span class="va">track_fixed</span>, </span>
<span> origin <span class="op">=</span> <span class="st">"2019-03-24 12:55:23"</span>, period <span class="op">=</span> <span class="st">"0.04S"</span>, </span>
<span> tz <span class="op">=</span> <span class="st">"America/New_York"</span><span class="op">)</span></span></code></pre></div>
<p>If you try to combine the 3 track tables using
<code>bind_tracks</code>, an error will be thrown to let you know that
they are not compatible with each other:</p>
<div class="sourceCode" id="cb25"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="va">bounded_tracks</span> <span class="op"><-</span> <span class="fu"><a href="../reference/bind_tracks.html">bind_tracks</a></span><span class="op">(</span><span class="va">track1</span>, <span class="va">track2</span>, <span class="va">track3</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Error in bind_tracks(track1, track2, track3): All track tables should have the same projection.</span></span></code></pre>
<p>Compare this to what happens with one of the traditional binding
methods:</p>
<div class="sourceCode" id="cb27"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="va">bounded_tracks</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/cbind.html" class="external-link">rbind</a></span><span class="op">(</span><span class="va">track1</span>, <span class="va">track2</span>, <span class="va">track3</span><span class="op">)</span></span>
<span><span class="fu"><a href="https://rdrr.io/r/base/print.html" class="external-link">print</a></span><span class="op">(</span><span class="va">bounded_tracks</span>, max <span class="op">=</span> <span class="fl">10</span> <span class="op">*</span> <span class="fu"><a href="https://rdrr.io/r/base/nrow.html" class="external-link">ncol</a></span><span class="op">(</span><span class="va">bounded_tracks</span><span class="op">)</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Track table [29182 observations]</span></span>
<span><span class="co">## Number of tracks: 81 </span></span>
<span><span class="co">## Dimensions: 2D </span></span>
<span><span class="co">## Geographic: TRUE </span></span>
<span><span class="co">## Projection: +proj=longlat </span></span>
<span><span class="co">## Table class: data frame ('data.frame')</span></span>
<span><span class="co">## id t x y</span></span>
<span><span class="co">## 1 1 2015-09-10 07:00:00 15.76459 -22.37971</span></span>
<span><span class="co">## 2 1 2015-09-10 07:00:01 15.76459 -22.37971</span></span>
<span><span class="co">## 3 1 2015-09-10 07:00:02 15.76459 -22.37971</span></span>
<span><span class="co">## 4 1 2015-09-10 07:00:03 15.76459 -22.37971</span></span>
<span><span class="co">## 5 1 2015-09-10 07:00:04 15.76459 -22.37971</span></span>
<span><span class="co">## 6 1 2015-09-10 07:00:05 15.76459 -22.37971</span></span>
<span><span class="co">## 7 1 2015-09-10 07:00:06 15.76459 -22.37971</span></span>
<span><span class="co">## 8 1 2015-09-10 07:00:07 15.76459 -22.37971</span></span>
<span><span class="co">## 9 1 2015-09-10 07:00:08 15.76459 -22.37971</span></span>
<span><span class="co">## 10 1 2015-09-10 07:00:09 15.76459 -22.37971</span></span>
<span><span class="co">## [ reached 'max' / getOption("max.print") -- omitted 29172 rows ]</span></span></code></pre>
<p>Here, the tracks tables are combined with each other despite having
different coordinate reference systems and time zones. Using
<code>bind_tracks</code> instead ensures that this cannot happen.</p>
<hr>
</div>
<div class="section level2">
<h2 id="tidyverse">3.5 - Tidyverse<a class="anchor" aria-label="anchor" href="#tidyverse"></a>
</h2>
<p>Track tables are compatible with (most) of the functions from the <a href="https://www.tidyverse.org/" class="external-link">“tidyverse”</a>. For instance, you can
use all the <a href="https://dplyr.tidyverse.org/" class="external-link"><code>dplyr</code></a> verbs to
filter, mutate, group, etc., a track table, in the same way you would do
with a <code><a href="https://tibble.tidyverse.org/reference/tibble.html" class="external-link">tibble::tibble</a></code> or a <code><a href="https://rdrr.io/r/base/data.frame.html" class="external-link">base::data.frame</a></code>.
As long as the result of the operation that you are applying to a track
table does not affect its fundamental structure (see vignette <a href="z2_build.html">“Building a track table”</a>), the output that you
will get will remain a track table with its specific attributes.</p>
<p>For instance, here is how to filter a track table to keep only the
observations between 2 specific time stamps:</p>
<div class="sourceCode" id="cb29"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="kw"><a href="https://rdrr.io/r/base/library.html" class="external-link">library</a></span><span class="op">(</span><span class="va"><a href="https://dplyr.tidyverse.org" class="external-link">dplyr</a></span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## </span></span>
<span><span class="co">## Attaching package: 'dplyr'</span></span></code></pre>
<pre><code><span><span class="co">## The following objects are masked from 'package:stats':</span></span>
<span><span class="co">## </span></span>
<span><span class="co">## filter, lag</span></span></code></pre>
<pre><code><span><span class="co">## The following objects are masked from 'package:base':</span></span>
<span><span class="co">## </span></span>
<span><span class="co">## intersect, setdiff, setequal, union</span></span></code></pre>
<div class="sourceCode" id="cb33"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="va">filtered_tracks</span> <span class="op"><-</span> <span class="va">tracks</span> <span class="op"><a href="https://magrittr.tidyverse.org/reference/pipe.html" class="external-link">%>%</a></span></span>
<span> <span class="fu"><a href="../reference/filter.html">filter</a></span><span class="op">(</span><span class="va">.</span>, <span class="va">t</span> <span class="op">>=</span> <span class="fu"><a href="https://rdrr.io/r/base/as.POSIXlt.html" class="external-link">as.POSIXct</a></span><span class="op">(</span><span class="st">"2015-09-10 07:01:00"</span>, tz <span class="op">=</span> <span class="st">"Africa/Windhoek"</span><span class="op">)</span>,</span>
<span> <span class="va">t</span> <span class="op"><=</span> <span class="fu"><a href="https://rdrr.io/r/base/as.POSIXlt.html" class="external-link">as.POSIXct</a></span><span class="op">(</span><span class="st">"2015-09-10 07:11:00 CAT"</span>, tz <span class="op">=</span> <span class="st">"Africa/Windhoek"</span><span class="op">)</span><span class="op">)</span></span>
<span><span class="fu"><a href="https://rdrr.io/r/base/print.html" class="external-link">print</a></span><span class="op">(</span><span class="va">filtered_tracks</span>, max <span class="op">=</span> <span class="fl">10</span> <span class="op">*</span> <span class="fu"><a href="https://rdrr.io/r/base/nrow.html" class="external-link">ncol</a></span><span class="op">(</span><span class="va">filtered_tracks</span><span class="op">)</span><span class="op">)</span></span></code></pre></div>
<pre><code><span><span class="co">## Track table [1202 observations]</span></span>
<span><span class="co">## Number of tracks: 2 </span></span>
<span><span class="co">## Dimensions: 2D </span></span>
<span><span class="co">## Geographic: TRUE </span></span>
<span><span class="co">## Projection: +proj=longlat </span></span>
<span><span class="co">## Table class: data frame ('data.frame')</span></span>
<span><span class="co">## id t x y</span></span>
<span><span class="co">## 1 1 2015-09-10 07:01:00 15.76468 -22.37961</span></span>
<span><span class="co">## 2 1 2015-09-10 07:01:01 15.76469 -22.37960</span></span>
<span><span class="co">## 3 1 2015-09-10 07:01:02 15.76469 -22.37960</span></span>
<span><span class="co">## 4 1 2015-09-10 07:01:03 15.76469 -22.37960</span></span>
<span><span class="co">## 5 1 2015-09-10 07:01:04 15.76470 -22.37960</span></span>
<span><span class="co">## 6 1 2015-09-10 07:01:05 15.76469 -22.37960</span></span>
<span><span class="co">## 7 1 2015-09-10 07:01:06 15.76469 -22.37960</span></span>
<span><span class="co">## 8 1 2015-09-10 07:01:07 15.76469 -22.37959</span></span>
<span><span class="co">## 9 1 2015-09-10 07:01:08 15.76469 -22.37959</span></span>
<span><span class="co">## 10 1 2015-09-10 07:01:09 15.76469 -22.37959</span></span>
<span><span class="co">## [ reached 'max' / getOption("max.print") -- omitted 1192 rows ]</span></span></code></pre>
<hr>
</div>
<div class="section level2">
<h2 id="plotting">3.6 - Plotting<a class="anchor" aria-label="anchor" href="#plotting"></a>
</h2>
<p>You can use any plotting method accepting a data frame of any class
to represent the data in a track table.</p>
<p>Here is an example using <a href="https://ggplot2.tidyverse.org/" class="external-link"><code>ggplot2</code></a>:</p>
<div class="sourceCode" id="cb35"><pre class="downlit sourceCode r">
<code class="sourceCode R"><span><span class="kw"><a href="https://rdrr.io/r/base/library.html" class="external-link">library</a></span><span class="op">(</span><span class="va"><a href="https://ggplot2.tidyverse.org" class="external-link">ggplot2</a></span><span class="op">)</span></span>
<span></span>
<span><span class="fu"><a href="https://ggplot2.tidyverse.org/reference/ggplot.html" class="external-link">ggplot</a></span><span class="op">(</span>data <span class="op">=</span> <span class="va">tracks</span><span class="op">)</span> <span class="op">+</span></span>
<span> <span class="fu"><a href="https://ggplot2.tidyverse.org/reference/aes.html" class="external-link">aes</a></span><span class="op">(</span>x <span class="op">=</span> <span class="va">x</span>, y <span class="op">=</span> <span class="va">y</span>, color <span class="op">=</span> <span class="va">id</span><span class="op">)</span> <span class="op">+</span></span>
<span> <span class="fu"><a href="https://ggplot2.tidyverse.org/reference/geom_path.html" class="external-link">geom_path</a></span><span class="op">(</span><span class="op">)</span> <span class="op">+</span></span>
<span> <span class="fu"><a href="https://ggplot2.tidyverse.org/reference/coord_map.html" class="external-link">coord_map</a></span><span class="op">(</span><span class="op">)</span></span></code></pre></div>
<p><img src="z3_manipulate_files/figure-html/unnamed-chunk-15-1.png" width="700"></p>
</div>
</main><aside class="col-md-3"><nav id="toc"><h2>On this page</h2>
</nav></aside>
</div>
<footer><div class="pkgdown-footer-left">
<p></p>
<p>Developed by <a href="https://www.theswarmlab.com" class="external-link">Simon Garnier</a>.</p>
</div>
<div class="pkgdown-footer-right">
<p></p>
<p>Site built with <a href="https://pkgdown.r-lib.org/" class="external-link">pkgdown</a> 2.0.7.</p>
</div>
</footer>
</div>
</body>
</html>