代码之家  ›  专栏  ›  技术社区  ›  abhiieor

列数据的2列列表。表

  •  1
  • abhiieor  · 技术社区  · 6 年前

    我有一个数据表如下:

    foo <- data.table(a = c(1,2,3), b = c(4,5,6))
    

    我想添加另一列c,它是按行/记录 a b 是的。类似于:

    data.table(a = c(1,2,3), b = c(4,5,6), c = c(list(1,4), list(2,5), list(3,6))) 
    

    但即使在这个例子中它也只需要一个元素并循环使用

       a b c
    1: 1 4 1
    2: 2 5 4
    3: 3 6 2
    4: 1 4 5
    5: 2 5 3
    6: 3 6 6
    

    不管我想要什么:

       a b c
    1: 1 4 list(1,4)
    2: 2 5 list(2,5)
    3: 3 6 list(3,6)
    

    我也试过:

    foo$c <- foo[, list('a' = a, 'b' = b)]
    foo$c <- foo[, list('a' = a, 'b' = b), by = 1:nrow(foo)]
    foo$c <- as.list(foo[, list('a' = a, 'b' = b)])
    

    什么都不管用。

    2 回复  |  直到 6 年前
        1
  •  2
  •   akuiper    6 年前

    一种方法是 Map list 以下内容:

    foo[, c := Map(list, a, b)][]
    
    #   a b      c
    #1: 1 4 <list>
    #2: 2 5 <list>
    #3: 3 6 <list>
    

    和列 c 是列表列表:

    dput(foo$c)
    # list(list(1, 4), list(2, 5), list(3, 6))
    

    保留姓名:

    foo[, c := Map(list, a=a, b=b)][]
    #   a b      c
    #1: 1 4 <list>
    #2: 2 5 <list>
    #3: 3 6 <list>
    
    dput(foo$c)
    # list(list(a = 1, b = 4), list(a = 2, b = 5), list(a = 3, b = 6))
    
        2
  •  1
  •   s_baldur    6 年前

    使用 list 而不是 c 似乎有效:

    data.table(a = c(1,2,3), b = c(4,5,6), c = list(list(1,4), list(2,5), list(3,6))) 
       a b      c
    1: 1 4 <list>
    2: 2 5 <list>
    3: 3 6 <list>