Замена фрагментированной числовой последовательности непрерывной последовательностью в data.table - PullRequest
0 голосов
/ 29 октября 2018

У меня есть вопрос относительно R и изменения значений числовой последовательности. У меня есть столбец в data.table, который выглядит примерно как X здесь:

X <- data.table(id = c("103", "103", "103", "104", "104", "160", "160"), 
content = c("I", "don't", "know", "some", "more", "words", "."))

И я хотел бы заменить значения id последовательными значениями, чтобы изменить начальную точку и избавиться от промежутков между ними. В реальной задаче было бы тысячи значений идентификаторов, поэтому их выбор не был бы возможен.

Итак, чего бы я хотел добиться, так это:

Y <- data.table(id = c("0", "0", "0", "1", "1", "2", "2"), 
content = c("I", "don't", "know", "some", "more", "words", "."))

Любая подсказка будет приветствоваться, так как я не знаю с чего начать. Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Другой вариант - rleid

library(data.table)
X[, id := rleid(id) - 1L][]
#   id content
#1:  0       I
#2:  0   don't
#3:  0    know
#4:  1    some
#5:  1    more
#6:  2   words
#7:  2       .

Если вы хотите, чтобы id был символом типа, тогда наберите

X[, id := as.character(rleid(id) - 1L)]
0 голосов
/ 29 октября 2018

Мы можем преобразовать 'id' в factor и затем привести его к integer

X[, id :=  as.character(as.integer(factor(id)) - 1)]

Или используйте match

X[, id := as.character(match(id, unique(id)) - 1)]

Или другой вариант .GRP

X[, id :=  as.character(.GRP -1) , id]

identical(X, Y)
#[1] TRUE

Или используя tidyverse

library(tidyverse)
X %>%
   mutate(id = as.character(match(id, unique(id)) - 1))

Или

X %>% 
  mutate(id = as.character(group_indices(., id) - 1))

Или

X %>% 
   mutate(id = as.character(cumsum(id != lag(id, default = first(id)))))

или с base R

X$id <- as.character(match(df$id, unique(df$id) - 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...