Typing ?rle() you will get description: “Compute the lengths and values of runs of equal values in a vector…” What, on earth, does it mean?
Well, as always, let’s first create a vector to play with. Let’s say it looks as follows:
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 7 7 7 7 8 8 8 9 9 10
You do not want to type all these numbers, do you? Hint: use rep() and rev() to create the vector efficently (consult help for the two function if necessary):
v <- rev(rep(10:1, 1:10)); v
## [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3
## [24] 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 7
## [47] 7 7 7 8 8 8 9 9 10
Now try the rle():
rle(v)
## Run Length Encoding
## lengths: int [1:10] 10 9 8 7 6 5 4 3 2 1
## values : int [1:10] 1 2 3 4 5 6 7 8 9 10
As you can see, the function tells you how many times each value is represented in your vector until it changes for another value. So you have: ten 1, nine 2, eight 3, seven 4, etc…
So what?? Could that be useful. Well, yes:)
Example: Imagine the vector is a sequence of birds visits at a feeder. Each number represents different individual, so individual #1 visited the feeder 10 times, individual #2 visited 9 times, etc. Now, you know and want to note that every second individual visiting the feeder was a female (the others were males). In other words, you want to create a vector that would look like this:
male male male male male male male male male male
female female female female female female female female female
male male male male male male male male
female female female female female female female
male male male male male male
female female female female female
male male male male
female female female
male male
female
Lenghy, right? Definatelly, you do not want to enter this vector mannually!
So, you use rle().
times <- rle(v)$lengths # You calculate the number of times when the character values - male/female - has to be repeated. You extract these numbers from rle output using $length.
x <- rep(c("male", "female"),5) # You create a temporary vector of male/female sequence [to be further used in another rep ()]. This is because you need an adequate number of elements to be repreated given number of times).
y <- rep(x = x, times = times); y
## [1] "male" "male" "male" "male" "male" "male" "male"
## [8] "male" "male" "male" "female" "female" "female" "female"
## [15] "female" "female" "female" "female" "female" "male" "male"
## [22] "male" "male" "male" "male" "male" "male" "female"
## [29] "female" "female" "female" "female" "female" "female" "male"
## [36] "male" "male" "male" "male" "male" "female" "female"
## [43] "female" "female" "female" "male" "male" "male" "male"
## [50] "female" "female" "female" "male" "male" "female"
You can further combine your two vectors in a data frame:
data.frame(BirdsID = v, Sex = y)
## BirdsID Sex
## 1 1 male
## 2 1 male
## 3 1 male
## 4 1 male
## 5 1 male
## 6 1 male
## 7 1 male
## 8 1 male
## 9 1 male
## 10 1 male
## 11 2 female
## 12 2 female
## 13 2 female
## 14 2 female
## 15 2 female
## 16 2 female
## 17 2 female
## 18 2 female
## 19 2 female
## 20 3 male
## 21 3 male
## 22 3 male
## 23 3 male
## 24 3 male
## 25 3 male
## 26 3 male
## 27 3 male
## 28 4 female
## 29 4 female
## 30 4 female
## 31 4 female
## 32 4 female
## 33 4 female
## 34 4 female
## 35 5 male
## 36 5 male
## 37 5 male
## 38 5 male
## 39 5 male
## 40 5 male
## 41 6 female
## 42 6 female
## 43 6 female
## 44 6 female
## 45 6 female
## 46 7 male
## 47 7 male
## 48 7 male
## 49 7 male
## 50 8 female
## 51 8 female
## 52 8 female
## 53 9 male
## 54 9 male
## 55 10 female
Sounds complicated? Make yourself tea/coffee, relax and read it again:)