R: элемент доступа в столбце списков с data.table - PullRequest
0 голосов
/ 09 февраля 2020

Я использую data.table для хранения большого массива объектов и хочу получить доступ к одному из этих объектов, но он всегда возвращает результат, заключенный в список.

library(data.table)

a1 = hist(1:10)
a2 = hist(2:11)
a3 = hist(3:12)
a4 = hist(4:13)
a5 = hist(5:14)
a6 = hist(6:15)

a = list(a1,a2,a3,a4,a5,a6)
i = c(1,1,1,2,2,2)
j = c(1,2,3,1,2,3)

dt = data.table(i = i, j = j, a = a)
class(dt[i == 1 & j == 1, a]) # hist inside a list of length 1

I ' Я хотел бы, чтобы предыдущая строка возвращалась к самому объекту (только гистограмме), например так:

class(a1) # just the hist

Очевидно, я мог бы сделать:

dt[i == 1 & j == 1, a][[1]]

Но кажется, что делать это каждый раз время. Любой способ добиться этого с помощью синтаксиса в data.table? Примечание: есть еще один вопрос с очень похожим именем, но он задает что-то более сложное.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Я думаю, что ваш единственный путь, или аналогичным образом я бы сделал dt[i == 1 & j == 1, a[[1]] ].

Вы можете написать вспомогательную функцию, например

get_a = function(ii,jj) dt[.(ii,jj), on=.(i,j), mult="first", a[[1]]]

, но можете сожалеть об этом, если вы когда-нибудь напишите подмножество, которое соответствует 0 или 2+ строкам таблицы:

get_a(1,1)   # works as expected
get_a(1,4)   # returns NULL
get_a(1,1:2) # returns only (1,1)

Если вы хотите избежать этого, можете добавить проверки на основе .N ...

get_listcol = function(..., d, list_col, join_cols = names(list(...)), mult = FALSE){
  d[list(...), on=join_cols, nomatch=0, {
    if (.N == 0L){
      stop("No matches found.")
    } else if (.N == 1L){
      .SD[[1]][[1]]
    } else {
      if (mult){
        .SD[[1]]
      } else {
        stop("Multiple matches found.")
      }
    }
  }, .SDcols=list_col]
}

# usage
get_a2 = function(ii, jj) get_listcol(i = ii, j = jj, d = dt, list_col = "a")
get_a2(1,1)   # works as expected
get_a2(1,4)   # error
get_a2(1,1:2) # error
1 голос
/ 09 февраля 2020

Хотя это не решает проблему root, матрица из hist объектов, кажется, более соответствует MRE.

mat = matrix(a, nrow = 2, ncol = 3)

mat[1, 2]
##would result in list

mat[1, 2][[1]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...