Plot dots over dateline with ggplot in R - r

I'm trying to plot some dots on a map in R but only half of them show up. I suppose it might have something to do with the dateline.
My sample data:
sites
longitude latitude
1 -136 53
2 140 33
3 -176 59
4 -138 47
5 -170 61
6 142 35
7 -128 45
8 -178 55
9 -140 57
10 -168 39
11 158 39
12 -178 45
13 144 45
14 -166 25
15 162 47
16 -178 35
17 -178 43
18 146 39
19 138 25
20 -178 25
21 140 33
22 166 45
23 142 37
24 164 45
25 -162 39
26 156 39
27 -178 53
28 -178 29
29 -150 59
30 -178 35
31 -176 57
32 138 43
33 164 59
34 -152 37
35 152 39
36 -178 61
37 164 35
38 174 51
39 -176 29
40 154 41
41 -140 51
42 120 35
43 -178 53
44 -168 55
45 -172 65
46 -126 59
47 -178 53
48 -144 45
49 -178 37
50 -122 59
51 -178 27
52 -176 43
53 128 27
54 -130 33
55 134 37
56 -156 55
57 -176 41
58 148 47
59 146 37
60 -164 37
61 158 35
62 124 47
63 162 63
64 -178 47
65 144 37
66 -170 25
67 120 41
68 -164 41
69 -178 45
70 140 47
71 164 45
72 -164 39
73 -178 41
74 120 35
75 -150 41
76 -154 45
77 124 43
78 148 39
79 -162 43
80 152 35
81 -138 39
82 124 29
83 -168 51
84 146 49
85 -178 35
86 -152 49
87 -162 43
88 160 53
89 152 35
90 126 31
91 -156 47
92 -174 33
93 164 41
94 160 37
95 -154 25
96 -178 41
97 142 49
98 -178 35
99 -178 51
100 138 35
101 -120 41
102 -160 47
103 148 37
104 166 41
105 -148 37
106 146 37
107 -168 53
108 -178 37
109 132 29
110 -122 57
The code:
wrld2 = st_as_sf(map('world2', plot=F, fill=T))
ggplot() +
geom_sf(data=wrld2, fill='lightgrey') +
geom_point(data=sites, aes(x = longitude, y = latitude), size = 4,
shape = 22, fill = "darkblue") +
coord_sf(xlim=c(-180,-120), ylim=c(25,65)) +
geom_sf(data=wrld2, fill='lightgrey') +
geom_point() +
geom_point(data=sites, aes(x = longitude, y = latitude), size = 4,
shape = 21, fill = "darkred") +
coord_sf(xlim=c(120,240), ylim=c(25,65)) +
theme(panel.background = element_rect(fill = "aliceblue"))
Only the Western part of the dateline is plotted with the correct dots (others are put on top):
The problem is that the blue data points are not plotted in their specific range (-180,-120 and 25,65) because of the two coordinate systems/dateline around +/- 180°. I can't seem to figure how to define the correct xlim so that the longitude ticks remain the same on the x-axis. Has anyone an idea what is missing or needs to be re-defined? Many thanks.

Related

How to Convert CSV to Raster in R?

I have a CSV (value, carbon, latitude, longitude) that I am trying to create a raster from.
CSV file sample:
Carbon Latitude Longitude coords.x1 coords.x2
1 385 36 74 36 74
2 463 36 74 36 74
3 35 36 74 36 74
4 38 36 74 36 74
5 34 36 74 36 74
6 11 36 74 36 74
7 46 36 74 36 74
8 18 36 74 36 74
9 213 36 74 36 74
10 619 36 74 36 74
11 140 36 74 36 74
12 40 36 74 36 74
13 42 36 74 36 74
14 18 36 74 36 74
15 277 36 74 36 74
16 641 36 74 36 74
17 416 36 74 36 74
18 459 36 74 36 74
19 1073 36 74 36 74
20 628 36 74 36 74
21 425 36 74 36 74
22 550 36 74 36 74
23 163 36 74 36 74
24 366 36 74 36 74
25 379 36 74 36 74
26 279 36 74 36 74
27 284 36 74 36 74
28 454 36 74 36 74
29 813 36 74 36 74
30 1296 36 74 36 74
31 1539 36 74 36 74
32 997 36 74 36 74
33 498 36 74 36 74
34 857 36 74 36 74
35 413 36 74 36 74
36 76 36 74 36 74
37 189 36 74 36 74
38 130 36 74 36 74
39 22 36 74 36 74
40 18 36 74 36 74
41 137 36 74 36 74
42 521 36 74 36 74
43 28 36 74 36 74
44 188 36 74 36 74
45 101 36 74 36 74
46 19 36 74 36 74
47 935 36 74 36 74
48 22 36 74 36 74
49 22 36 74 36 74
50 165 36 74 36 74
51 274 36 74 36 74
52 316 36 74 36 74
53 270 36 74 36 74
54 125 36 74 36 74
55 116 36 74 36 74
56 109 36 74 36 74
57 70 36 74 36 74
58 194 36 74 36 74
59 36 36 74 36 74
60 24 36 74 36 74
61 93 36 74 36 74
62 32 36 74 36 74
63 144 36 74 36 74
64 47 36 74 36 74
65 304 36 74 36 74
66 338 36 74 36 74
67 214 36 74 36 74
68 150 36 74 36 74
69 1799 36 74 36 74
70 394 36 74 36 74
71 24 36 74 36 74
72 117 36 74 36 74
73 140 36 74 36 74
74 47 36 74 36 74
75 3 36 74 36 74
76 221 36 74 36 74
77 41 36 74 36 74
78 319 36 74 36 74
79 119 36 74 36 74
80 39 36 74 36 74
81 3 36 74 36 74
82 2 36 74 36 74
83 15 36 74 36 74
84 69 36 74 36 74
85 40 36 74 36 74
86 233 36 74 36 74
87 15 36 74 36 74
88 147 36 74 36 74
89 50 36 74 36 74
90 348 36 74 36 74
91 549 36 74 36 74
92 5 36 74 36 74
93 191 36 74 36 74
94 409 36 75 36 75
95 93 36 75 36 75
96 1641 36 75 36 75
97 154 36 75 36 75
98 852 36 75 36 75
99 1571 36 75 36 75
100 1173 36 75 36 75
101 19 36 75 36 75
102 9 36 75 36 75
103 15 36 75 36 75
104 67 36 75 36 75
105 666 36 75 36 75
106 3 36 75 36 75
107 227 36 75 36 75
108 130 36 75 36 75
109 423 36 75 36 75
110 31 36 75 36 75
111 559 36 75 36 75
112 143 36 75 36 75
113 63 36 75 36 75
114 1211 36 75 36 75
115 280 36 75 36 75
116 1027 36 75 36 75
117 636 36 75 36 75
118 207 36 75 36 75
119 233 36 75 36 75
120 332 36 75 36 75
121 266 36 75 36 75
122 266 36 75 36 75
123 284 36 75 36 75
124 240 36 75 36 75
125 613 36 75 36 75
126 28 36 75 36 75
127 762 36 75 36 75
128 58 36 75 36 75
129 310 36 75 36 75
130 12 36 75 36 75
131 15 36 75 36 75
132 343 36 75 36 75
133 128 36 75 36 75
134 177 36 75 36 75
135 320 36 75 36 75
136 205 36 75 36 75
137 108 36 75 36 75
138 1445 36 75 36 75
139 109 36 75 36 75
140 251 36 75 36 75
141 262 36 75 36 75
142 282 36 75 36 75
143 188 36 75 36 75
144 207 36 75 36 75
145 63 36 75 36 75
146 63 36 75 36 75
147 194 36 75 36 75
148 170 36 75 36 75
149 196 36 75 36 75
150 85 36 75 36 75
151 93 36 75 36 75
152 79 36 75 36 75
153 656 36 75 36 75
154 56 36 75 36 75
155 93 36 75 36 75
156 28 36 75 36 75
157 4 35 75 35 75
158 3 35 75 35 75
159 82 35 75 35 75
160 48 35 75 35 75
161 64 35 75 35 75
162 72 35 75 35 75
163 86 35 75 35 75
164 12 35 75 35 75
165 73 35 75 35 75
166 77 35 75 35 75
167 2162 35 75 35 75
168 854 35 75 35 75
169 51 35 75 35 75
170 61 35 75 35 75
171 11 35 75 35 75
172 8 35 75 35 75
173 16 35 75 35 75
174 58 35 75 35 75
175 50 35 75 35 75
176 53 35 75 35 75
177 8 35 75 35 75
178 48 35 75 35 75
179 235 35 75 35 75
180 38 35 75 35 75
181 75 35 75 35 75
182 25 35 75 35 75
183 12 35 75 35 75
184 18 35 75 35 75
185 51 35 75 35 75
186 19 35 75 35 75
187 22 35 75 35 75
188 1595 35 75 35 75
189 77 35 75 35 75
190 1673 35 75 35 75
191 42 35 75 35 75
192 120 35 75 35 75
193 66 35 75 35 75
194 53 35 75 35 75
195 66 35 75 35 75
196 6 35 75 35 75
197 5 35 75 35 75
198 36 35 75 35 75
199 54 35 75 35 75
200 46 35 75 35 75
class : SpatialPointsDataFrame
features : 13135
extent : 35, 37, 73, 76 (xmin, xmax, ymin, ymax)
crs : NA
variables : 3
names : Carbon, Latitude, Longitude
min values : 1, 35, 73
max values : 5829, 37, 76
R Script:
library(sp) # vector data
library(raster) # raster data
library(rgdal) # input/output, projections
library(rgeos) # geometry ops
library(spdep) # spatial dependence
foresta<-carbonstock
head(carbonstock)
data<-data.frame(carbonstock$Longitude,carbonstock$Latitude,carbonstock$Carbon)
data<-data.frame(carbonstock)
# points from scratch
coords = cbind(carbonstock$Latitude, carbonstock$Longitude)
sp = SpatialPoints(coords)
# make spatial data frame
spdf = SpatialPointsDataFrame(coords, data)
spdf = SpatialPointsDataFrame(sp, data)
# promote data frame to spatial
coordinates(data) = cbind(carbonstock$Latitude, carbonstock$Longitude)
coordinates(data) = ~lon + lat
# back to data
as.data.frame(data)
plot(data,)
library(raster)
dfr <- rasterFromXYZ(data) #Convert first two columns as lon-lat and third as value
plot(dfr)
dfr
library(raster)
# create spatial points data frame
spg <- data
x<-carbonstock$Latitude
y<-carbonstock$Longitude
coordinates(spg) <- ~ x + y
# coerce to SpatialPixelsDataFrame
gridded(spg) <- TRUE
# coerce to raster
rasterDF <- raster(spg)

reprex setting output width

How do I set the width of a reprex output?
Say I have a code like this:
(x <- 1:100)
I get this with reprex::reprex(venue = "so")
(x <- 1:100)
#> [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#> [18] 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#> [35] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#> [52] 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
#> [69] 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
#> [86] 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
How can I increase the width of the output to output something like this
[1] 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] 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
Possible Solutions
One option that I have found but I find rather "un-tidy" is this (include options(width = ...) at the top of the code. But I don't want it to show up in the output, I'd prefer setting the width in the reprex-call.
options(width = 205)
(x <- 1:100)
#> [1] 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] 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
reprex() allows for knitr's opts-chunk, but I can't get it working with reprex::reprex(venue = "so", opts_chunk = list(out.width = 205)) (which might be related to #421 as pointed out here (Long lines of text output))
Any better solutions?
reprex has a syntax for setting these options but not including them in the output markdown (see here for examples). In this case:
reprex({
#+ setup, include = FALSE
options(width=205)
#+ actual-reprex-code
(x <- 1:100)
}, venue = 'so')
outputs your desired format:
(x <- 1:100)
#> [1] 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] 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
Created on 2018-09-21 by the reprex package (v0.2.1)

Generate all possible dataframes by combining rows of a initial dataframe

I have this dataframe:
> prueba
S1 S2 S3 M1 M2 M3
Block-1 23 67 143 37 87 104
Block-2 43 76 145 43 76 103
Block-3 35 87 165 44 88 116
Block-4 45 55 145 43 97 156
Block-5 33 65 159 54 96 145
Block-6 37 54 139 51 91 166
Block-7 33 56 149 56 93 156
Block-8 38 55 135 57 94 167
Block-9 33 52 134 59 98 168
So, I want to generate all possible diferent dataframes by combining only 6 of the 9 rows that have the initial dataframe. Thanks to the "combn" function, I know there are 84 combinations of 6 blocks, now I want to have in a list of dataframes all those combinations with their respective S1,S2,S3,M1,M2,M3 values.
The solution would be like this:
> prueba1
S1 S2 S3 M1 M2 M3
Block-1 23 67 143 37 87 104
Block-2 43 76 145 43 76 103
Block-3 35 87 165 44 88 116
Block-4 45 55 145 43 97 156
Block-5 33 65 159 54 96 145
Block-6 37 54 139 51 91 166
> prueba2
S1 S2 S3 M1 M2 M3
Block-1 23 67 143 37 87 104
Block-2 43 76 145 43 76 103
Block-3 35 87 165 44 88 116
Block-4 45 55 145 43 97 156
Block-5 33 65 159 54 96 145
Block-7 33 56 149 56 93 156
·
·
·
Thanks.

How can we determine a transition point in a curve for a bar graph

I have plotted a bar graph and knowing that the transition in the curve takes place around values 21 to 25 , I want to find such point in general.
barplot(Views$V2,names=Views$V1,las=2,cex.names=0.2,border="blue",xpd=FALSE)
abline(v=25,col="red")
Any help is appreciated
Update :
A part of my data frame is given below. It is sorted by values V2 . By transition what I want to say is that a point in the sorted data where there is a large deviation and after which it continues in that pattern. So a point where there is difference in patterns.
V1 V2
1 1 16154424
2 2 3701944
3 3 1618377
4 4 903302
5 5 569824
6 6 389772
7 7 281751
8 8 212450
9 9 166364
10 10 133339
11 11 109410
12 12 90934
13 13 77155
14 14 66124
15 15 57861
16 16 50765
17 17 44805
18 18 39996
19 19 35850
20 20 32492
21 21 29522
22 22 27152
23 23 24821
24 24 22619
25 25 21238
26 26 19639
27 27 18320
28 28 16867
29 29 15890
30 30 14936
31 31 14252
32 32 13150
33 33 12696
34 34 11656
35 35 11191
36 36 10951
37 37 10232
38 38 9605
39 39 9058
40 40 8916
41 41 8531
42 42 8010
43 43 7932
44 44 7436
45 45 6991
46 46 6750
47 47 6613
48 48 6254
49 49 6292
50 50 5731
51 51 5659
52 52 5551
53 53 5396
54 54 5122
55 55 4845
56 56 4860
57 57 4591
58 58 4504
59 59 4233
60 60 4371
61 61 4014
62 62 4083
63 63 3923
64 64 3796
65 65 3616
66 66 3519
67 67 3466
68 68 3409
69 69 3357
70 70 3215
71 71 3118
72 72 3081
73 73 3040
74 74 2951
75 75 2808
76 76 2797
77 77 2829
78 78 2714
79 79 2564
80 80 2563
81 81 2445
82 82 2528
83 83 2443
84 84 2316
85 85 2314
86 86 2212
87 87 2215
88 88 2102
89 89 2172
90 90 2020
91 91 2108
92 92 2020
93 93 2027
94 94 1982
95 95 1936
96 96 1836
97 97 1801
98 98 1850
99 99 1751
100 100 1810
It has to be something to do with the ratios of differences maybe and something which can be evident after observing the graph.

Sequence with different intervals in R: matching sensor data

I need a vector that repeats numbers in a sequence at varying intervals. I basically need this
c(rep(1:42, each=6), rep(43:64, each = 7),
rep(65:106, each=6), rep(107:128, each = 7),
.... but I need to this to keep going, until almost 2 million.
So I want a vector that looks like
[1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 ...
.....
[252] 43 43 43 43 43 43 43 44 44 44 44 44 44 44
....
[400] 64 64 64 64 64 64 65 65 65 65 65 65...
and so on. Not just alternating between 6 and 7 repetitions, rather mostly 6s and fewer 7s until the whole vector is something like 1.7 million rows. So, is there a loop I can do? Or apply, replicate? I need the 400th entry in the vector to be 64, the 800th entry to be 128, and so on, in somewhat evenly spaced integers.
UPDATE
Thank you all for the quick clever tricks there. It worked, at least well enough for the deadline I was dealing with. I realize repeating 6 xs and 7 xs are a really dumb way to try to solve this, but it was quick at least. But now that I have some time, I would like to get everyone's opinions /ideas on my real underlying issue here.
I have two datasets to merge. They are both sensor datasets, both with stopwatch time as primary keys. But one records every 1/400 of a second, and the other records every 1/256 of a second. I have trimmed the top of each so that they are starting the exact same moment. But.. now what? I have 400 records for each second in one set, and 256 records for 1 second in the other. Is there a way to merge these without losing data? Interpolating or just repeating obs is a-ok, necessary, I think, but I'd rather not throw any data out.
I read this post here, that had to do with using xts and zoo for a very similar problem to mine. But they have nice epoch date/times for each. I just have these awful fractions of seconds!
sample data (A):
time dist a_lat
1 139.4300 22 0
2 139.4325 22 0
3 139.4350 22 0
4 139.4375 22 0
5 139.4400 22 0
6 139.4425 22 0
7 139.4450 22 0
8 139.4475 22 0
9 139.4500 22 0
10 139.4525 22 0
sample data (B):
timestamp hex_acc_x hex_acc_y hex_acc_z
1 367065215501 -0.5546875 -0.7539062 0.1406250
2 367065215505 -0.5468750 -0.7070312 0.2109375
3 367065215509 -0.4218750 -0.6835938 0.1796875
4 367065215513 -0.5937500 -0.7421875 0.1562500
5 367065215517 -0.6757812 -0.7773438 0.2031250
6 367065215521 -0.5937500 -0.8554688 0.2460938
7 367065215525 -0.6132812 -0.8476562 0.2109375
8 367065215529 -0.3945312 -0.8906250 0.2031250
9 367065215533 -0.3203125 -0.8906250 0.2226562
10 367065215537 -0.3867188 -0.9531250 0.2578125
(oh yeah, and btw, the B dataset timestamps are epoch format * 256, because life is hard. i haven't converted it for this because dataset A has nothing like that, only just 0.0025 intervals. Also the B data sensor was left on for hours later the A data sensor turned off, so that doesn't help)
Or if you like, you can try this using apply
# using this sample data
df <- data.frame(from=c(1,4,7,11), to = c(3,6,10,13),rep=c(6,7,6,7));
> df
# from to rep
#1 1 3 6
#2 4 6 7
#3 7 10 6
#4 11 13 7
unlist(apply(df, 1, function(x) rep(x['from']:x['to'], each=x['rep'])))
# [1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 4
#[26] 5 5 5 5 5 5 5 6 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8
#[51] 8 9 9 9 9 9 9 10 10 10 10 10 10 11 11 11 11 11 11 11 12 12 12 12 12
#[76] 12 12 13 13 13 13 13 13 13
Now that you put it that way ... I have absolutely no idea how you are planning on using all of the 6s and 7s. :-)
Regardless, I recommend standardizing the time, adding a "sample" column, and merging on them. Having the "sample" column may facilitate your processing later on, perhaps.
Your data:
df400 <- structure(list(time = c(139.43, 139.4325, 139.435, 139.4375, 139.44, 139.4425,
139.445, 139.4475, 139.45, 139.4525),
dist = c(22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L),
a_lat = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)),
.Names = c("time", "dist", "a_lat"),
class = "data.frame", row.names = c(NA, -10L))
df256 <- structure(list(timestamp = c(367065215501, 367065215505, 367065215509, 367065215513,
367065215517, 367065215521, 367065215525, 367065215529,
367065215533, 367065215537),
hex_acc_x = c(-0.5546875, -0.546875, -0.421875, -0.59375, -0.6757812,
-0.59375, -0.6132812, -0.3945312, -0.3203125, -0.3867188),
hex_acc_y = c(-0.7539062, -0.7070312, -0.6835938, -0.7421875,
-0.7773438, -0.8554688, -0.8476562, -0.890625,
-0.890625, -0.953125),
hex_acc_z = c(0.140625, 0.2109375, 0.1796875, 0.15625, 0.203125,
0.2460938, 0.2109375, 0.203125, 0.2226562, 0.2578125)),
.Names = c("timestamp", "hex_acc_x", "hex_acc_y", "hex_acc_z"),
class = "data.frame", row.names = c(NA, -10L))
Standardize your time frames:
colnames(df256)[1] <- 'time'
df400$time <- df400$time - df400$time[1]
df256$time <- (df256$time - df256$time[1]) / 256
Assign a label for easy reference (not that the NAs won't be clear enough):
df400 <- cbind(sample='A', df400, stringsAsFactors=FALSE)
df256 <- cbind(sample='B', df256, stringsAsFactors=FALSE)
And now for the merge and sorting:
dat <- merge(df400, df256, by=c('sample', 'time'), all.x=TRUE, all.y=TRUE)
dat <- dat[order(dat$time),]
dat
## sample time dist a_lat hex_acc_x hex_acc_y hex_acc_z
## 1 A 0.000000 22 0 NA NA NA
## 11 B 0.000000 NA NA -0.5546875 -0.7539062 0.1406250
## 2 A 0.002500 22 0 NA NA NA
## 3 A 0.005000 22 0 NA NA NA
## 4 A 0.007500 22 0 NA NA NA
## 5 A 0.010000 22 0 NA NA NA
## 6 A 0.012500 22 0 NA NA NA
## 7 A 0.015000 22 0 NA NA NA
## 12 B 0.015625 NA NA -0.5468750 -0.7070312 0.2109375
## 8 A 0.017500 22 0 NA NA NA
## 9 A 0.020000 22 0 NA NA NA
## 10 A 0.022500 22 0 NA NA NA
## 13 B 0.031250 NA NA -0.4218750 -0.6835938 0.1796875
## 14 B 0.046875 NA NA -0.5937500 -0.7421875 0.1562500
## 15 B 0.062500 NA NA -0.6757812 -0.7773438 0.2031250
## 16 B 0.078125 NA NA -0.5937500 -0.8554688 0.2460938
## 17 B 0.093750 NA NA -0.6132812 -0.8476562 0.2109375
## 18 B 0.109375 NA NA -0.3945312 -0.8906250 0.2031250
## 19 B 0.125000 NA NA -0.3203125 -0.8906250 0.2226562
## 20 B 0.140625 NA NA -0.3867188 -0.9531250 0.2578125
I'm guessing your data was just a small representation. If I've guessed poorly (that A's integers are seconds and B's integers are 1/400ths of a second) then just scale differently. Either way, by resetting the first value to zero and then merging/sorting, they are easy to merge and sort.
alt <- data.frame(len=c(42,22),rep=c(6,7));
alt;
## len rep
## 1 42 6
## 2 22 7
altrep <- function(alt,cyc,len) {
cyclen <- sum(alt$len*alt$rep);
if (missing(cyc)) {
if (missing(len)) {
cyc <- 1;
len <- cyc*cyclen;
} else {
cyc <- ceiling(len/cyclen);
};
} else if (missing(len)) {
len <- cyc*cyclen;
};
if (isTRUE(all.equal(len,0))) return(integer());
result <- rep(1:(cyc*sum(alt$len)),rep(rep(alt$rep,alt$len),cyc));
length(result) <- len;
result;
};
altrep(alt,2);
## [1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8 8 9 9 9
## [52] 9 9 9 10 10 10 10 10 10 11 11 11 11 11 11 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17 17 17 17 17
## [103] 18 18 18 18 18 18 19 19 19 19 19 19 20 20 20 20 20 20 21 21 21 21 21 21 22 22 22 22 22 22 23 23 23 23 23 23 24 24 24 24 24 24 25 25 25 25 25 25 26 26 26
## [154] 26 26 26 27 27 27 27 27 27 28 28 28 28 28 28 29 29 29 29 29 29 30 30 30 30 30 30 31 31 31 31 31 31 32 32 32 32 32 32 33 33 33 33 33 33 34 34 34 34 34 34
## [205] 35 35 35 35 35 35 36 36 36 36 36 36 37 37 37 37 37 37 38 38 38 38 38 38 39 39 39 39 39 39 40 40 40 40 40 40 41 41 41 41 41 41 42 42 42 42 42 42 43 43 43
## [256] 43 43 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 45 46 46 46 46 46 46 46 47 47 47 47 47 47 47 48 48 48 48 48 48 48 49 49 49 49 49 49 49 50 50 50 50 50
## [307] 50 50 51 51 51 51 51 51 51 52 52 52 52 52 52 52 53 53 53 53 53 53 53 54 54 54 54 54 54 54 55 55 55 55 55 55 55 56 56 56 56 56 56 56 57 57 57 57 57 57 57
## [358] 58 58 58 58 58 58 58 59 59 59 59 59 59 59 60 60 60 60 60 60 60 61 61 61 61 61 61 61 62 62 62 62 62 62 62 63 63 63 63 63 63 63 64 64 64 64 64 64 64 65 65
## [409] 65 65 65 65 66 66 66 66 66 66 67 67 67 67 67 67 68 68 68 68 68 68 69 69 69 69 69 69 70 70 70 70 70 70 71 71 71 71 71 71 72 72 72 72 72 72 73 73 73 73 73
## [460] 73 74 74 74 74 74 74 75 75 75 75 75 75 76 76 76 76 76 76 77 77 77 77 77 77 78 78 78 78 78 78 79 79 79 79 79 79 80 80 80 80 80 80 81 81 81 81 81 81 82 82
## [511] 82 82 82 82 83 83 83 83 83 83 84 84 84 84 84 84 85 85 85 85 85 85 86 86 86 86 86 86 87 87 87 87 87 87 88 88 88 88 88 88 89 89 89 89 89 89 90 90 90 90 90
## [562] 90 91 91 91 91 91 91 92 92 92 92 92 92 93 93 93 93 93 93 94 94 94 94 94 94 95 95 95 95 95 95 96 96 96 96 96 96 97 97 97 97 97 97 98 98 98 98 98 98 99 99
## [613] 99 99 99 99 100 100 100 100 100 100 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106 107 107 107 107 107
## [664] 107 107 108 108 108 108 108 108 108 109 109 109 109 109 109 109 110 110 110 110 110 110 110 111 111 111 111 111 111 111 112 112 112 112 112 112 112 113 113 113 113 113 113 113 114 114 114 114 114 114 114
## [715] 115 115 115 115 115 115 115 116 116 116 116 116 116 116 117 117 117 117 117 117 117 118 118 118 118 118 118 118 119 119 119 119 119 119 119 120 120 120 120 120 120 120 121 121 121 121 121 121 121 122 122
## [766] 122 122 122 122 122 123 123 123 123 123 123 123 124 124 124 124 124 124 124 125 125 125 125 125 125 125 126 126 126 126 126 126 126 127 127 127 127 127 127 127 128 128 128 128 128 128 128
altrep(alt,len=1000);
## [1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8 8 9 9 9
## [52] 9 9 9 10 10 10 10 10 10 11 11 11 11 11 11 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17 17 17 17 17
## [103] 18 18 18 18 18 18 19 19 19 19 19 19 20 20 20 20 20 20 21 21 21 21 21 21 22 22 22 22 22 22 23 23 23 23 23 23 24 24 24 24 24 24 25 25 25 25 25 25 26 26 26
## [154] 26 26 26 27 27 27 27 27 27 28 28 28 28 28 28 29 29 29 29 29 29 30 30 30 30 30 30 31 31 31 31 31 31 32 32 32 32 32 32 33 33 33 33 33 33 34 34 34 34 34 34
## [205] 35 35 35 35 35 35 36 36 36 36 36 36 37 37 37 37 37 37 38 38 38 38 38 38 39 39 39 39 39 39 40 40 40 40 40 40 41 41 41 41 41 41 42 42 42 42 42 42 43 43 43
## [256] 43 43 43 43 44 44 44 44 44 44 44 45 45 45 45 45 45 45 46 46 46 46 46 46 46 47 47 47 47 47 47 47 48 48 48 48 48 48 48 49 49 49 49 49 49 49 50 50 50 50 50
## [307] 50 50 51 51 51 51 51 51 51 52 52 52 52 52 52 52 53 53 53 53 53 53 53 54 54 54 54 54 54 54 55 55 55 55 55 55 55 56 56 56 56 56 56 56 57 57 57 57 57 57 57
## [358] 58 58 58 58 58 58 58 59 59 59 59 59 59 59 60 60 60 60 60 60 60 61 61 61 61 61 61 61 62 62 62 62 62 62 62 63 63 63 63 63 63 63 64 64 64 64 64 64 64 65 65
## [409] 65 65 65 65 66 66 66 66 66 66 67 67 67 67 67 67 68 68 68 68 68 68 69 69 69 69 69 69 70 70 70 70 70 70 71 71 71 71 71 71 72 72 72 72 72 72 73 73 73 73 73
## [460] 73 74 74 74 74 74 74 75 75 75 75 75 75 76 76 76 76 76 76 77 77 77 77 77 77 78 78 78 78 78 78 79 79 79 79 79 79 80 80 80 80 80 80 81 81 81 81 81 81 82 82
## [511] 82 82 82 82 83 83 83 83 83 83 84 84 84 84 84 84 85 85 85 85 85 85 86 86 86 86 86 86 87 87 87 87 87 87 88 88 88 88 88 88 89 89 89 89 89 89 90 90 90 90 90
## [562] 90 91 91 91 91 91 91 92 92 92 92 92 92 93 93 93 93 93 93 94 94 94 94 94 94 95 95 95 95 95 95 96 96 96 96 96 96 97 97 97 97 97 97 98 98 98 98 98 98 99 99
## [613] 99 99 99 99 100 100 100 100 100 100 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106 107 107 107 107 107
## [664] 107 107 108 108 108 108 108 108 108 109 109 109 109 109 109 109 110 110 110 110 110 110 110 111 111 111 111 111 111 111 112 112 112 112 112 112 112 113 113 113 113 113 113 113 114 114 114 114 114 114 114
## [715] 115 115 115 115 115 115 115 116 116 116 116 116 116 116 117 117 117 117 117 117 117 118 118 118 118 118 118 118 119 119 119 119 119 119 119 120 120 120 120 120 120 120 121 121 121 121 121 121 121 122 122
## [766] 122 122 122 122 122 123 123 123 123 123 123 123 124 124 124 124 124 124 124 125 125 125 125 125 125 125 126 126 126 126 126 126 126 127 127 127 127 127 127 127 128 128 128 128 128 128 128 129 129 129 129
## [817] 129 129 130 130 130 130 130 130 131 131 131 131 131 131 132 132 132 132 132 132 133 133 133 133 133 133 134 134 134 134 134 134 135 135 135 135 135 135 136 136 136 136 136 136 137 137 137 137 137 137 138
## [868] 138 138 138 138 138 139 139 139 139 139 139 140 140 140 140 140 140 141 141 141 141 141 141 142 142 142 142 142 142 143 143 143 143 143 143 144 144 144 144 144 144 145 145 145 145 145 145 146 146 146 146
## [919] 146 146 147 147 147 147 147 147 148 148 148 148 148 148 149 149 149 149 149 149 150 150 150 150 150 150 151 151 151 151 151 151 152 152 152 152 152 152 153 153 153 153 153 153 154 154 154 154 154 154 155
## [970] 155 155 155 155 155 156 156 156 156 156 156 157 157 157 157 157 157 158 158 158 158 158 158 159 159 159 159 159 159 160 160
You can specify len=1.7e6 (and omit the cyc argument) to get exactly 1.7 million elements, or you can get a whole number of cycles using cyc.
How about
len <- 2e6
step <- 400
x <- rep(64 * seq(0, ceiling(len / step) - 1), each = step) +
sort(rep(1:64, length.out = step))
x <- x[seq(len)] # to get rid of extra elements

Resources