Создайте последовательную переменную count по групповой переменной - PullRequest
1 голос
/ 04 октября 2019

У меня есть такие данные:

df<-data.frame(one=c(1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 7), 
               test=c(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0))

Я хочу суммировать количество последовательных 'тестов' по переменной 'one', но важно, чтобы они были последовательными. Поэтому я бы хотел:

dfwant<-data.frame(one=c(1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 7), 
        test=c(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0), 
        want=c(2, 2, 1, 1, 1, 2, 2, 3, 3, 3, 1, 1, 1, 0, 0))

Я довольно близко подошел к rle, но так и не смог создать новый столбец want.

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

Попытка в базе R с использованием ave, группировка по столбцу one и накопленная сумма значений, не равных 1 в столбце test:

ave(df$test, list(df$one, cumsum(df$test != 1)), FUN=function(x) if(any(x==1)) sum(x) else x )
# [1] 2 2 1 1 1 2 2 3 3 3 1 1 1 0 0

Сокращениеэтой логики, с подсказкой к @RonakShah:

ave(df$test == 1, df$one, cumsum(df$test != 1), FUN = sum)
2 голосов
/ 04 октября 2019

Один параметр - rleid из data.table, сгруппированный по идентификатору длины прогона 'one', 'test', получает sum из 'test' как 'want', сгруппированный по 'one', mutate 'want' как max для 'want'

library(dplyr)
library(data.table)
df %>% 
   group_by(grp = rleid(one, test))%>%
   mutate(want = sum(test)) %>%
   group_by(one) %>%
   mutate(want = max(want)) %>%       
   dplyr::select(-grp)
# A tibble: 15 x 3
# Groups:   one [7]
#     one  test  want
#   <dbl> <dbl> <dbl>
# 1     1     1     2
# 2     1     1     2
# 3     2     1     1
# 4     2     0     1
# 5     2     1     1
# 6     3     1     2
# 7     3     1     2
# 8     4     1     3
# 9     4     1     3
#10     4     1     3
#11     5     0     1
#12     5     1     1
#13     6     1     1
#14     7     0     0
#15     7     0     0

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

setDT(df)[, want := max(tabulate(rleid(test))* test), .(one)]
1 голос
/ 04 октября 2019

Вы можете использовать rle для получения длин различных серий с помощью 1 и затем взять максимальную из этих длин

library(dplyr)
df %>%
    group_by(one) %>%
    mutate(want = with(rle(test == 1), max(0, lengths[values], na.rm = TRUE)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...