I have a grouped dataset, but the groups don\'t have a unique identifier, like this:
direction <- c(\'N\',\'S\',\'W\',\'N\',\'N\',\'S\',\'W\',\'N\',\'S\',\'W\
You can get this result with ==
to identify elements with "N" and cumsum
to construct indices. Then pull out the values from the stored vector LETTERS as suggested in balter's answer.
Here, cumsum
sums over a logical vector, coercing it to numeric binary (1s, and 0s). It thus repeats the same value and increments any time an "N" was encountered.
x$ID <- LETTERS[cumsum(x$direction == "N")]
This returns
x
direction measurement ID
1 N 4 A
2 S 6 A
3 W 1 A
4 N 7 B
5 N 2 C
6 S 4 C
7 W 7 C
8 N 4 D
9 S 1 D
10 W 4 D
I think this should work:
direction <- c('N','S','W','N','N','S','W','N','S','W')
measurement <- c(4,6,1,7,2,4,7,4,1,4)
x <- data.frame(direction, measurement)
inds <- which(direction == 'N')
diffs <- diff(c(inds, length(direction)+1))
groups <- rep(seq_along(inds),diffs)
x$ID <- LETTERS[groups]
x
Note that if you have more than 26 groups, LETTERS[]
will start returning NA. You can always just use:
x$ID <- groups
If that happens.