【问题标题】:R: access element in a column of lists with data.tableR:使用 data.table 访问列表列中的元素
【发布时间】:2020-05-24 18:34:38
【问题描述】:

我正在使用 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

我希望上一行返回对象本身(只是直方图),如下所示:

class(a1) # just the hist

显然我可以做到:

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

但每次都这样做似乎很不雅。有什么方法可以使用 data.table 中的语法来实现这一点?注意:还有另一个问题的名称非常相似,但它问的问题更复杂。

【问题讨论】:

    标签: r arrays list data.table


    【解决方案1】:

    虽然这没有解决根本问题,但hist 对象矩阵似乎更符合 MRE。

    mat = matrix(a, nrow = 2, ncol = 3)
    
    mat[1, 2]
    ##would result in list
    
    mat[1, 2][[1]]
    
    

    【讨论】:

      【解决方案2】:

      我认为你的方法是唯一的方法,或者类似地我会这样做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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        • 2021-12-20
        • 2014-09-24
        • 2021-05-17
        • 1970-01-01
        相关资源
        最近更新 更多