#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)]