R: group_id путем изменения значений строки - PullRequest
1 голос
/ 18 апреля 2020

1) Во-первых, у меня есть этот фрейм данных:

df <- data.frame(value=c("a","a","a", "b", "b", "b", "a", "a", "a"), ,
                 desired_id=c(1,1,1,2,2,2,3,3,3))

Как мне сгенерировать столбец desired_id? Мои группы назначаются по порядку строк. То есть каждый раз, когда изменяется столбец value, я хочу, чтобы групповые индексы присваивали следующие более высокие групповые индексы.

Я пытался df$desired_id_replicate <- df %>% group_by(value) %>% group_indices, но это не работает, так как всем value=="a" будет присвоен те же групповые индексы.

2) Во-вторых, у меня есть этот фрейм данных:

df <- data.frame(value=c("a","a","a", "b", "b", "b", "a", "a", "a"), 
                 value2=c("a","a","c", "b", "b", "c", "a", "a", "d"),
                 desired_id=c(1,1,2,3,3,4,5,5,6))

Как мне сгенерировать desired_id из столбцов value и value2. Мои группы снова назначаются построчно. То есть, каждый раз, когда изменяется уникальная комбинация value и value2, следует назначать следующую более высокую desired_id.

Как и выше, я пробовал df$desired_id_replicate <- df %>% group_by(value, value2) %>% group_indices, но это не работает как всем value=="a"&value2=="a" будут присвоены одинаковые групповые индексы.

Спасибо!

1 Ответ

1 голос
/ 18 апреля 2020

Мы можем использовать rleid (идентификатор кодировки длины серии) из data.table, который в основном будет увеличивать 1 для каждого элемента, который не равен предыдущему элементу

library(data.table)
library(dplyr)
df%>%
  mutate(newcol = rleid(value))

, а для второго набор данных, это будет

df %>%
     mutate(new = rleid(value, value2))
#  value value2 desired_id new
#1     a      a          1   1
#2     a      a          1   1
#3     a      c          2   2
#4     b      b          3   3
#5     b      b          3   3
#6     b      c          4   4
#7     a      a          5   5
#8     a      a          5   5
#9     a      d          6   6

или с rle из base R

df$newcol <- with(rle(df$value), rep(seq_along(values), lengths))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...