Добавить индекс (или счетчик) в кадр данных по группе в R

у меня ДФ вроде

ProjectID Dist
  1        x
  1        y
  2        z
  2        x
  2        h
  3        k
  ....     ....

Я хочу добавить третий столбец, чтобы у нас был увеличивающийся счетчик для каждого ProjectID:

ProjectID Dist counter
  1        x     1
  1        y     2
  2        z     1
  2        x     2
  2        h     3
  1        k     3
  ....     ....

Я просмотрел seq rank и пару других битов, особенно пытаясь понять, могу ли я использовать ddply, чтобы помочь:

df$counter <- ddply(df,.(projectID), function(x).....? )

Думаю, я мог бы адаптировать этот ответ Как создать счетчик /нумерация по группе?, но предпочел бы что-то вроде ddply (я не могу найти эквивалент cumsum, но я думаю, что здесь тот же принцип: Создать возрастающую серию целых чисел по группе в Pandas). Это позволило бы мне индексировать вхождения в списке (и, например, объединить это).


person sjgknight    schedule 21.02.2015    source источник
comment
Вы можете попробовать ave, т.е. df$counter <- with(df, ave(seq_along(ProjectID), ProjectID, FUN=seq_along)), или компактная оболочка будет library(splitstackshape);getanID(df, 'ProjectID')[] или использовать plyr; ddply(df, .(ProjectID), mutate, counter=seq_along(Dist))   -  person akrun    schedule 21.02.2015
comment
Хорошо, это работает (спасибо!), но я действительно не понимаю, что он делает? (у меня болит голова)   -  person sjgknight    schedule 21.02.2015
comment
Мы группируем по ProjectID и создаем новый столбец в виде последовательности Dist для каждой группы. Вам будет легко это сделать после того, как вы прочитаете страницы справки и попробуете несколько примеров.   -  person akrun    schedule 21.02.2015
comment
Это использование ave я (думаю) сбиваю с толку - я получаю пример ddply (который также отлично работает, еще раз спасибо), но использование ave вместе с seq_along я изо всех сил пытаюсь понять   -  person sjgknight    schedule 21.02.2015
comment
В ave вторым аргументом является группирующая переменная, т.е. `ave(x, ..., FUN = mean)`. Если вы посмотрите на описание `...: Группирующие переменные, обычно факторы, имеют одинаковую «длину», как 'х'.` . Вы также можете использовать ave(ProjectID, ProjectID, FUN=seq_along), но когда у вас есть столбцы character/factor, это приведет либо к ошибке, либо к получению символьных элементов в качестве вывода.   -  person akrun    schedule 21.02.2015


Ответы (1)


Решение dplyr довольно простое:

library(dplyr)

df %>% group_by(ProjectID) %>% mutate(counter = row_number(ProjectID))


#  ProjectID Dist counter
#1         1    x       1
#2         1    y       2
#3         2    z       1
#4         2    x       2
#5         2    h       3
#6         1    k       3
person jalapic    schedule 21.02.2015
comment
mutate(counter=row_number()) должен это сделать. - person akrun; 21.02.2015
comment
Это, наверное, глупый вопрос... что %>% делает? (И немного попутно, есть ли способ эффективно искать [google] для такого типа кода?) - person sjgknight; 21.02.2015
comment
%>% — оператор канала или цепочки... он работает следующим образом: mydata %>% do_something_with_it %>% do_something_else — он просто позволяет вам объединять функции в цепочку. - person jalapic; 21.02.2015
comment
О, здорово, очень интересно - спасибо! - person sjgknight; 21.02.2015