Взятие среза data.table с последовательностью индексов (row, col) - PullRequest
0 голосов
/ 01 июня 2018

У меня есть data.table, который похож на тот, что приведен ниже.

tab <- data.table(a = c(NA, 42190, NA), b = c(42190, 42190, NA), c = c(40570, 42190, NA))
tab
       a     b     c
1:    NA 42190 40570
2: 42190 42190 42190
3:    NA    NA    NA

После указания вектора индексов строк и вектора индексов столбцов я хотел бы, чтобы возвращаемый вектор содержал точки вtab соответствует указанному вектору индексов строк и столбцов.

Например, предположим, что я хотел получить диагональные элементы в tab.Я бы указал два вектора,

ri <- 1:3
ci <- 1:3

, и некоторая функция, function(ri, ci, tab), вернет диагональные элементы tab.

Если бы tab было data.frame, ябудет делать то, что ниже,

as.data.frame(tab)[cbind(ri, ci)]

, но я бы хотел избежать синтаксиса data.frame.Я также хотел бы избежать цикла for, поскольку он имеет тенденцию быть медленным.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Есть более быстрый способ сделать это, чем принуждение к матрице или data.frame.Просто используйте функцию [data.frame.

`[.data.frame`( tab,  cbind(ri,ci) )
[1]    NA 42190    NA

Это функциональный синтаксис для функции [.data.frame.

0 голосов
/ 01 июня 2018

(ОБНОВЛЕНИЕ: @ 42-ый ответ с использованием [.data.frame лучше. Но вот мой предыдущий ответ)

as.matrix(tab)[cbind(ri, ci)]

будет быстрее и эффективнее с точки зрения памятичем melt.

Я не вижу причин, по которым вы не объявляете свой DT матрицей, как рекомендует @thelatemail.Это один из случаев, когда синтаксис DT не такой мощный, как матрица.

(Для повышения эффективности памяти с большими DT, data.table имеет команды setDF / setDT, чтобы разрешить преобразование в / из DF / DTбез копирования, но я не знаю, что у него есть эквивалент для матрицы. Если это то, что люди часто делают, он может сделать хороший запрос на расширение для DT.

Для действительно больших измерений, вы можете посмотретьв матричные форматы разреженной матрицы пакет), или порцию ваших данных, или использование структур данных на основе диска.)

...