Итерация по группам или идентификаторам

#r

#r

Вопрос:

Я пытаюсь выполнить итерацию по группам или идентификаторам в R, и я не могу понять, как это сделать простым способом.

В качестве примера я не могу понять, как сделать Study_Time столбец во фрейме данных.

 ID  Gender
1   Male
1   Male
1   Male
2   Female
2   Female
2   Female
3   Male
3   Male
3   Male
  

Мне нужно получить это:

 ID  Gender  Study_Time
1   Male    1
1   Male    2
1   Male    3
2   Female  1
2   Female  2
2   Female  3
3   Male    1
3   Male    2
3   Male    3
  

PS: Я пробовал использовать условия if else, но реальные данные получены из опроса, в котором проводилось более 50 исследований. Итак, мне нужно что-то более простое.

Комментарии:

1. Используйте ave , т. е. with(df1, ave(ID, ID, Gender, FUN = seq_along))

2. Спасибо! @akrun. С ave() работает очень хорошо.

Ответ №1:

Вы могли бы сделать это без необходимости группировать по:

 df$Study_Time <- unlist(mapply(function(i) seq_len(i), rle(as.numeric(df$Gender))$lengths))

#   ID Gender Study_Time
#1   1   Male          1
#2   1   Male          2
#3   1   Male          3
#4   2 Female          1
#5   2 Female          2
#6   2 Female          3
#7   3   Male          1
#8   3   Male          2
#9   3   Male          3
#10  3   Male          4
  

Или, если вы хотите сделать это с помощью group by:

 df$Study_Time <- unlist(aggregate(Gender~ID, df, seq_along)$Gender)
  

Ответ №2:

Вы можете сделать это с помощью dplyr :

 library(dplyr)

df %>% group_by(id) %>% mutate(Study_Time = row_number())
  

Ответ №3:

Мы можем сделать с ave из base R

 df1$Study_Time <- with(df1, ave(ID, ID, Gender, FUN = seq_along))
  

Или с data.table

 library(data.table)
setDT(df1)[, Study_Time := 1:.N, .(ID, Gender)]