xyy
xyy

Reputation: 547

How to generate an uneven sequence of numbers in R

Here's an example data frame:

df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2))

I want to generate a sequence of numbers according to the number of observations of y per x group (e.g. there are 2 observations of y for x=1). I want the sequence to be continuously increasing and jumps by 2 after each x group.

The desired output for this example would be:

1,2,5,6,7,10,11,14,17,20,21,22,25,26

How can I do this simply in R?

Upvotes: 0

Views: 1076

Answers (1)

chappers
chappers

Reputation: 2415

To expand on my comment, the groupings can be arbitrary, you simply need to recast it to the correct ordering. There are a few ways to do this, @akrun has shown that this can be accomplished using match function, or you can make use the the as.numeric function if this is easier to understand for yourself.

df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2))

# these are equivalent
df$newx <- as.numeric(factor(df$x, levels=unique(df$x)))
df$newx <- match(df$x, unique(df$x))

Since you now have a "new" releveling which is sequential, we can use the logic that was discussed in the comments.

df$newNumber <- 1:nrow(df) + (df$newx-1)*2

For this example, this will result in the following dataframe:

x y newx newNumber
1 1    1         1
1 2    1         2
2 3    2         5
2 4    2         6
2 6    2         7
3 3    3        10
3 7    3        11
4 8    4        14
5 6    5        17
6 4    6        20
6 3    6        21
6 7    6        22
9 3    7        25
9 2    7        26

where df$newNumber is the output you wanted.


To create the sequence 0,0,4,4,4,9,..., basically what you're doing is taking the minimum of each group and subtracting 1. The easiest way to do this is using the library(dplyr).

library(dplyr)
df %>% 
  group_by(x) %>%
  mutate(newNumber2 = min(newNumber) -1)

Which will have the output:

Source: local data frame [14 x 5]
Groups: x

   x y newx newNumber newNumber2
1  1 1    1         1          0
2  1 2    1         2          0
3  2 3    2         5          4
4  2 4    2         6          4
5  2 6    2         7          4
6  3 3    3        10          9
7  3 7    3        11          9
8  4 8    4        14         13
9  5 6    5        17         16
10 6 4    6        20         19
11 6 3    6        21         19
12 6 7    6        22         19
13 9 3    7        25         24
14 9 2    7        26         24

Upvotes: 2

Related Questions