【问题标题】:R data.table create list column by groupR data.table 按组创建列表列
【发布时间】:2018-11-22 00:59:12
【问题描述】:

我在下面有一个data.table,我想将一个函数应用于v2 列,按v1order 分组,结果列v3 应该是下面的向量列表。

如何编写此函数,以便它为每个组的第一行 (order == 1 & v1 %in% c(1, 2)) 返回一个 0 向量。对于组中的每个后续行,向量会将前一行的 v2 值附加到向量的右侧,同时从左侧撞出一个 0

初始data.table

t3 <- data.table(
  v1 = rep(1:2, each = 5),
  order = rep(1:5, 2),
  v2 = c(6, 9, 6, 8, 6, 2, 5, 7, 8, 2)
)

    v1 order v2
 1:  1     1  6
 2:  1     2  9
 3:  1     3  6
 4:  1     4  8
 5:  1     5  6
 6:  2     1  2
 7:  2     2  5
 8:  2     3  7
 9:  2     4  8
10:  2     5  2

正在应用函数...

输出:

t3[, v3 := list(c(0, 0, 0, 0, 0),
                c(0, 0, 0, 0, 6),
                c(0, 0, 0, 6, 9),
                c(0, 0, 6, 9, 6),
                c(0, 6, 9, 6, 8),
                c(0, 0, 0, 0, 0),
                c(0, 0, 0, 0, 2),
                c(0, 0, 0, 2, 5),
                c(0, 0, 2, 5, 7),
                c(0, 2, 5, 7, 8))]

    v1 order v2        v3
 1:  1     1  6 0,0,0,0,0
 2:  1     2  9 0,0,0,0,6
 3:  1     3  6 0,0,0,6,9
 4:  1     4  8 0,0,6,9,6
 5:  1     5  6 0,6,9,6,8
 6:  2     1  2 0,0,0,0,0
 7:  2     2  5 0,0,0,0,2
 8:  2     3  7 0,0,0,2,5
 9:  2     4  8 0,0,2,5,7
10:  2     5  2 0,2,5,7,8

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以试试

    t3[order(order), .(order, v2, shift(v2, 5:1, fill = 0)), by = v1]
    

    输出:

        v1 order v2        V3
     1:  1     1  6 0,0,0,0,0
     2:  1     2  9 0,0,0,0,6
     3:  1     3  6 0,0,0,6,9
     4:  1     4  8 0,0,6,9,6
     5:  1     5  6 0,6,9,6,8
     6:  2     1  2 0,0,0,0,0
     7:  2     2  5 0,0,0,0,2
     8:  2     3  7 0,0,0,2,5
     9:  2     4  8 0,0,2,5,7
    10:  2     5  2 0,2,5,7,8
    

    【讨论】:

    • 这是一个很好的答案!我不知道您可以使用shift 创建一个列表。谢谢谢谢谢谢!!
    • 不客气。 Matt & Company 做得非常出色,“data.table”太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多