Как бы то ни было, я не знаю решение data.table
, чтобы выбрать первые n строк в группах в таблице данных. Не могли бы вы помочь мне?data.table - выберите первые n строк в группе
ответ
В качестве альтернативы:
dt[, .SD[1:3], cyl]
Когда вы смотрите на скорости на примере набора данных, метод head
находится на одном уровне с .I
method of @eddi. По сравнению с microbenchmark
пакета:
microbenchmark(head = dt[, head(.SD, 3), cyl],
SD = dt[, .SD[1:3], cyl],
I = dt[dt[, .I[1:3], cyl]$V1],
times = 10, unit = "relative")
приводит:
Unit: relative
expr min lq mean median uq max neval cld
head 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000 10 a
SD 2.156562 2.319538 2.306065 2.365190 2.318540 2.1908401 10 b
I 1.001810 1.029511 1.007371 1.018514 1.016583 0.9442973 10 a
Однако data.table
специально спроектированные для больших наборов данных. Таким образом, бег это сравнение еще раз:
# creating a 30 million dataset
largeDT <- dt[,.SD[sample(.N, 1e7, replace = TRUE)], cyl]
# running the benchmark on the large dataset
microbenchmark(head = largeDT[, head(.SD, 3), cyl],
SD = largeDT[, .SD[1:3], cyl],
I = largeDT[largeDT[, .I[1:3], cyl]$V1],
times = 10, unit = "relative")
приводит:
Unit: relative
expr min lq mean median uq max neval cld
head 2.279753 2.194702 2.221330 2.177774 2.276986 2.33876 10 b
SD 2.060959 2.187486 2.312009 2.236548 2.568240 2.55462 10 b
I 1.000000 1.000000 1.000000 1.000000 1.000000 1.00000 10 a
Теперь метод .I
явно самый быстрый один.
Update 2016-02-12:
С самой последней версией разработки в data.table пакета , метод .I
еще выигрывает. Может ли метод .SD
или метод head()
работать быстрее, зависит от размера набора данных. Теперь тест дает:
Unit: relative
expr min lq mean median uq max neval cld
head 2.093240 3.166974 3.473216 3.771612 4.136458 3.052213 10 b
SD 1.840916 1.939864 2.658159 2.786055 3.112038 3.411113 10 b
I 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 10 a
Однако с несколько меньшим набором данных (но все-таки довольно большой), шансы изменить:
largeDT2 <- dt[,.SD[sample(.N, 1e6, replace = TRUE)], cyl]
эталоном теперь немного в пользу метода head
над .SD
метод:
Unit: relative
expr min lq mean median uq max neval cld
head 1.808732 1.917790 2.087754 1.902117 2.340030 2.441812 10 b
SD 1.923151 1.937828 2.150168 2.040428 2.413649 2.436297 10 b
I 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 10 a
Было ли это сделано с 1.9.7? Я знаю, что некоторые операции с '.SD' недавно были оптимизированы ... – MichaelChirico
@MichaelChirico Да, но я использую относительно старую версию 1.9.7 (вскоре после введения' rowid'). Итак, это зависит от того, как недавно было последнее ;-) – Jaap
Я думаю, что соответствующие коммиты были в начале ноября – MichaelChirico
Мы можем использовать head
с .SD
library(data.table)
dt <- data.table(mtcars)
> dt[, head(.SD, 3), by = "cyl"]
cyl mpg disp hp drat wt qsec vs am gear carb
1: 6 21.0 160.0 110 3.90 2.620 16.46 0 1 4 4
2: 6 21.0 160.0 110 3.90 2.875 17.02 0 1 4 4
3: 6 21.4 258.0 110 3.08 3.215 19.44 1 0 3 1
4: 4 22.8 108.0 93 3.85 2.320 18.61 1 1 4 1
5: 4 24.4 146.7 62 3.69 3.190 20.00 1 0 4 2
6: 4 22.8 140.8 95 3.92 3.150 22.90 1 0 4 2
7: 8 18.7 360.0 175 3.15 3.440 17.02 0 0 3 2
8: 8 14.3 360.0 245 3.21 3.570 15.84 0 0 3 4
9: 8 16.4 275.8 180 3.07 4.070 17.40 0 0 3 3
отметить, что на самом деле 'АЭМ d.data.table' ('getAnywhere (« head.data.table »)) просто вызывает (немного более надежную) версию ответа @ Jaap. – MichaelChirico
- 1. Выберите n строк в группе в mysql
- 2. Выберите N случайных строк в группе
- 3. Выберите первые N записей после фильтрации в каждой группе
- 4. выберите первые N столбцов таблицы MySQL
- 5. KDB: выберите первые n строк из каждой группы
- 6. Haskell читает первые n строк
- 7. Запретить прокручивать первые n строк
- 8. Выберите n первых строк матрицы
- 9. Получить первые/последние n записей в группе по
- 10. Выберите N случайных записей в группе
- 11. Как выбрать первые N строк каждой группы?
- 12. В Firebird, как собрать первые N строк?
- 13. Как удалить первые n строк в области
- 14. Выберите первые N цифр целого числа
- 15. SQL - выберите первые n вхождений каждого значения
- 16. Как пропустить первые n строк в sql-запросе
- 17. data.table получить N наиболее часто используемых значений по группе
- 18. Выбрать первые N строк Кассандры таблицы
- 19. Извлечь только первые N строк трассировки стека
- 20. Как просмотреть только первые n строк файла?
- 21. jQuery: выберите первые пять строк таблицы
- 22. IntelliJ, выберите первые несколько строк datasource view
- 23. Выберите первые 5 строк и получить подсчет
- 24. SQL - выберите только первые 10 строк?
- 25. MySQL Query получить последние N строк в группе
- 26. Выберите N строк до и N строк после записи
- 27. Заполните пропущенные значения по группе в data.table
- 28. Pandas drop первые несколько строк содержат nan в каждой группе
- 29. MySQL выбрать первые п строк в каждой группе
- 30. Pandas: выберите первую пару строк в каждой группе
это очень близко к: http://stackoverflow.com/questions/10110616/throw-away-first-and-last-n-rows – MichaelChirico