Простая задача: мне нужно извлечь (скажем) 1-й и 2-й элементы подгруппы.
DT <- data.table (X=c(1,2), Y=round(rnorm(5),1), key = "X"); DT
X Y
1: 1 -0.4
2: 1 0.5
3: 1 1.2
4: 2 1.0
5: 2 -0.3
Итак, мне нужно получить DT2, который будет
1: 1 -0.4
2: 1 0.5
3: 2 1.0
4: 2 -0.3
Это не работает:
DT2 <- DT[, .(first = .SD[1], second=.SD[2]), by=X]
Что работает?
Можем создать группу head
DT[, head(.SD, 2), X]
Или извлеките индекс строки (.I
) и подмножество
DT[DT[, .I[1:2], X]$V1]
Вот решение с использованием tidyverse/dplyr. Первый раздел использует tibble, который является расширением обычного фрейма данных.
library(tidyverse)
df <- tibble(
x = c(1, 1, 1, 2, 2),
y = c(-0.4, 0.5, 1.2, 1.0, -0.3)
)
df
# A tibble: 5 x 2
x y
<dbl> <dbl>
1 1 -0.4
2 1 0.5
3 1 1.2
4 2 1
5 2 -0.3
df2 <-
df %>%
group_by(x) %>%
slice(1:2) %>%
ungroup()
df2
# A tibble: 4 x 2
x y
<dbl> <dbl>
1 1 -0.4
2 1 0.5
3 2 1
4 2 -0.3
Следующий код также дает тот же результат. Если порядок важен, setkey или order можно запустить заранее.
DT <- data.table (X=c(1,2), Y=round(rnorm(5),1), key = "X"); DT
X Y
1: 1 0.5
2: 1 1.4
3: 1 0.0
4: 2 -1.5
5: 2 -0.3
DT[,Y[1:2],.(X)]
X V1
1: 1 0.5
2: 1 1.4
3: 2 -1.5
4: 2 -0.3
Вот как я бы это сделал, и я думаю, что способ предназначена (авторы пакета):
DT[, .SD[1:2], by = X]
.SD
означает подмножество data.table, набор столбцов. То, что вы хотели присвоитьfirst
иsecond
, — это отдельные столбцы. Просто используйтеY[1L]
иY[2L]
вместо.SD
.