Отметить первое (или n-е) наблюдение группы

#r #data.table

#r #данные.таблица

Вопрос:

У меня есть следующие данные:

 DT = data.table(ID = c(1, 1, 2, 3, 3, 3), Y = c(2001, 2002, 1999, 2001, 2001, 2002))

DT
   ID  Y
1:  1 2001
2:  1 2002
3:  2 1999
4:  3 2001
5:  3 2001
6:  3 2002
  

уникальным ключом набора данных является ID и Y . Я хотел бы создать переменную first , равную 1 для первого наблюдения группы, data.table как определено ключом:

 DT
   ID  Y    first
1:  1 2001    1
2:  1 2002    0
3:  2 1999    1
4:  3 2001    1
5:  3 2001    1
6:  3 2002    0
  

Я пытался что-то .I[1L] сделать, но не мог понять. Кроме того, дополнительным вопросом было бы создать такую переменную для n -го наблюдения (при условии, что n < максимальное количество obs. во всех группах). Спасибо вам всем!

Ответ №1:

Мы можем использовать rleid :

 library(data.table)
n <- 1

DT[, first := as.integer(rleid(Y) == n), ID]

#   ID    Y first
#1:  1 2001     1
#2:  1 2002     0
#3:  2 1999     1
#4:  3 2001     1
#5:  3 2001     1
#6:  3 2002     0
  

Ответ №2:

Может быть, вы можете попробовать head

 DT[,first :=  (Y==head(Y,1)), by = ID]
  

или более компактное (спасибо @akrun)

 DT[, first :=  (Y == Y[1]), ID]
  

или более общее (еще раз спасибо @akrun)

 library(dplyr)
DT[, first :=  (Y %in% nth(Y, 1)), by = ID]
  

что дает

 > DT
   ID    Y first
1:  1 2001     1
2:  1 2002     0
3:  2 1999     1
4:  3 2001     1
5:  3 2001     1
6:  3 2002     0
  

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

1. @akrun Спасибо! Да, это более компактно 🙂

2. @akrun Это более общее решение, еще раз спасибо!

3. Спасибо! Как бы вы выбрали группу, которая включает в себя более 1 переменной?

4. @vog Мы можем использовать .(a,b,c) , например

5. Это не работает в моем df. Может ли это быть причиной того, что мои группирующие переменные являются символами?