Чтобы найти разницу между уникальными уровнями - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть столбец, в котором у меня есть уникальные уровни, я хочу найти разрыв (разницу между уровнями).

У меня есть данные

x=c(0,0,0,0,0,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4,4) 

Результат для этого долженбыть:

1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 5 6

Ответы [ 4 ]

0 голосов
/ 19 сентября 2018

Мы можем использовать rleid из data.table

library(data.table)
ave(x, rleid(x), FUN = seq_along)
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6

Или преобразовать в data.table, а затем сгруппировать по rleid

data.table(x)[, seq_len(.N), x]$V1
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6

Или после использования rle, извлечь lengths и применить sequence

sequence(rle(x)$lengths)
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6
0 голосов
/ 19 сентября 2018

Не точный ответ, но ее подход использует rle ...

x=c(0,0,0,0,1,0,0,0,0,2,0,0,3,4)

y <- rle(x)

> y
# Run Length Encoding
# lengths: int [1:7] 4 1 4 1 2 1 1
# values : num [1:7] 0 1 0 2 0 3 4
0 голосов
/ 19 сентября 2018

Мы можем использовать ave и создать группирующую переменную с cumsum и diff, чтобы зафиксировать разницу в уникальных уровнях и создать последовательность с seq_along

ave(x, c(0, cumsum(diff(x) != 0)), FUN = seq_along)
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6

Дляданный пример, как предлагает @markus, работает

ave(x, x, FUN = seq_along)
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6

, но что, если ввод будет

x=c(0,0,0,0,0,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4,4,0,0)

с использованием

ave(x, x, FUN = seq_along) #gives
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6 6 7

, тогда как

ave(x, c(0, cumsum(diff(x) != 0)), FUN = seq_along) #gives
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6 1 2
0 голосов
/ 19 сентября 2018

Это не очень понятный код, но он выполняет свою работу:

res = ifelse(x == 0, 0, ifelse(c(0, x[-length(x)]) != 0, 0, NA))
res[is.na(res)] = with(rle(x == 0), lengths[values])
res
# [1] 0 0 0 0 4 0 0 0 0 4 0 0 2 0

Возможно, это лучше:

res2 = x
res2[x != 0] = diff(c(0, which(x != 0))) - 1
res2
# [1] 0 0 0 0 4 0 0 0 0 4 0 0 2 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...