R делают субфакторы на основе последовательно встречающегося значения - PullRequest
0 голосов
/ 16 мая 2018

Привет Кто-нибудь знает, как сделать субфактор или уникальный маркер для групп данных с одинаковым значением или коэффициентом последовательно

чтобы мои данные могли выглядеть так

value   group| subgrouping  
1       a     a.1
5       a     a.1
2       a     a.1
3       b     b.1
2       b     b.1
5       b     b.1
2       b     b.1
1       b     b.1
3       b     b.1
2       a     a.2
5       a     a.2
5       a     a.2
6       a     a.2
6       a     a.2
2       a     a.2
1       a     a.2
0       c     c.1
3       c     c.1
3       c     c.1
2       b     b.2
1       b     b.2
3       a     a.3
2       b     b.3
3       b     b.3

Таким образом, я могу найти, скажем, среднее значение для а.2, а не для всех

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Попробуйте rle:

x <- rle(df$group)
x$values <- with(x, ave(values, values, FUN = function(x) paste0(x, '.', seq_along(x))))
df$subgrouping2 <- inverse.rle(x)
df

# '> df
#     value group subgrouping subgrouping2
# 1:     1     a         a.1          a.1
# 2:     5     a         a.1          a.1
# 3:     2     a         a.1          a.1
# 4:     3     b         b.1          b.1
# 5:     2     b         b.1          b.1
# 6:     5     b         b.1          b.1
# 7:     2     b         b.1          b.1
# 8:     1     b         b.1          b.1
# 9:     3     b         b.1          b.1
# 10:     2     a         a.2          a.2
# 11:     5     a         a.2          a.2
# 12:     5     a         a.2          a.2
# 13:     6     a         a.2          a.2
# 14:     6     a         a.2          a.2
# 15:     2     a         a.2          a.2
# 16:     1     a         a.2          a.2
# 17:     0     c         c.1          c.1
# 18:     3     c         c.1          c.1
# 19:     3     c         c.1          c.1
# 20:     2     b         b.2          b.2
# 21:     1     b         b.2          b.2
# 22:     3     a         a.3          a.3
# 23:     2     b         b.3          b.3
# 24:     3     b         b.3          b.3
0 голосов
/ 16 мая 2018

С помощью data.table, сгруппированного по идентификатору длины прогона 'group (rleid(group)), получите значение first' group 'и количество наблюдений (.N), затем сгруппируйте по' group', paste последовательность наблюдений с помощью' group ', скопируйте ее на количество наблюдений после order ing с помощью' ind 'и назначьте их для создания' subgroup2 '

library(data.table)
sgrp <- setDT(df1)[, .(group = first(group), n = .N), 
  .(ind = rleid(group))][, .(paste(group, seq_len(.N), sep="."), n, ind), 
       group][order(ind), rep(V1, n)]
df1[, subgroup2 := sgrp]
df1
#    value group subgrouping subgroup2
# 1:     1     a         a.1       a.1
# 2:     5     a         a.1       a.1
# 3:     2     a         a.1       a.1
# 4:     3     b         b.1       b.1
# 5:     2     b         b.1       b.1
# 6:     5     b         b.1       b.1
# 7:     2     b         b.1       b.1
# 8:     1     b         b.1       b.1
# 9:     3     b         b.1       b.1
#10:     2     a         a.2       a.2
#11:     5     a         a.2       a.2
#12:     5     a         a.2       a.2
#13:     6     a         a.2       a.2
#14:     6     a         a.2       a.2
#15:     2     a         a.2       a.2
#16:     1     a         a.2       a.2
#17:     0     c         c.1       c.1
#18:     3     c         c.1       c.1
#19:     3     c         c.1       c.1
#20:     2     b         b.2       b.2
#21:     1     b         b.2       b.2
#22:     3     a         a.3       a.3
#23:     2     b         b.3       b.3
#24:     3     b         b.3       b.3
0 голосов
/ 16 мая 2018

Я нашел этот трюк, чтобы хорошо работать в этой ситуации. Как написано, он не отслеживает каждую группу в отдельности, но этого может быть достаточно:

df %>% 
  mutate(subgroup_id = cumsum(lag(group, default = group[1]) != group))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...