Первое наблюдение по группе с помощью самостоятельного соединения
Я пытаюсь получить верхнюю строку группой из трех переменных, используя таблицу data.table.
У меня есть рабочее решение:
col1 <- c(1,1,1,1,2,2,2,2,3,3,3,3)
col2 <- c(2000,2000,2001,2001,2000,2000,2001,2001,2000,2000,2001,2001)
col4 <- c(1,2,3,4,5,6,7,8,9,10,11,12)
data <- data.frame(store=col1,year=col2,month=12,sales=col4)
solution1 <- data.table(data)[,.SD[1,],by="store,year,month"]
Я использовал более медленный подход, предложенный Мэтью Доуле по следующей ссылке:
https://stats.stackexchange.com/info/7884/fast-ways-in-r-to-get-the-first-row-of-a-data-frame-grouped-by-an-identifier
Я пытаюсь реализовать более быстрое самостоятельное соединение, но не могу заставить его работать.
Есть ли у кого-нибудь предложения?
Ответы
Ответ 1
вариант 1 (с использованием клавиш)
Задайте ключ store, year, month
DT <- data.table(data, key = c('store','year','month'))
Затем вы можете использовать unique
для создания таблицы данных, содержащей уникальные значения ключевых столбцов. По умолчанию это займет первую запись
unique(DT)
store year month sales
1: 1 2000 12 1
2: 1 2001 12 3
3: 2 2000 12 5
4: 2 2001 12 7
5: 3 2000 12 9
6: 3 2001 12 11
Но, конечно, вы могли бы использовать самосоединение с mult='first'
. (другие параметры: 'all'
или 'last'
)
# the key(DT) subsets the key columns only, so you don't end up with two
# sales columns
DT[unique(DT[,key(DT), with = FALSE]), mult = 'first']
Вариант 2 (Нет ключей)
Без установки клавиши было бы быстрее использовать .I
не .SD
DTb <- data.table(data)
DTb[DTb[,list(row1 = .I[1]), by = list(store, year, month)][,row1]]
Ответ 2
Как насчет:
solution2 <- data.table(data)[ , sales[1], by="store,year,month"]
> solution2
store year month V1
1: 1 2000 12 1
2: 1 2001 12 3
3: 2 2000 12 5
4: 2 2001 12 7
5: 3 2000 12 9
6: 3 2001 12 11
Я думаю, вы могли бы переименовать этот столбец:
data.table(data)[,fsales := sales[1],by="store,year,month"]