R data.table 按组创建列表列

标签 r data.table

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

如何编写此函数,使其为每个组的第一行返回一个 0 向量(order == 1 & v1 %in% c(1, 2))。对于组中的每个后续行,向量会将前一行的 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

最佳答案

我们可以尝试

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

关于R data.table 按组创建列表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415886/

相关文章:

r - 按索引移动数据表行

r - 数据表 - 从另一列按名称选择列的值

R:按两个因素之一的值重新排序 geom_bar(stat = "identity",position=position_dodge())

r - 对时间序列进行子集化,以便选定的行在某个最小时间上有所不同

r - 跳过 data.table 中的 NA

r - 组合时间序列对象和列表:软件包“termstrc”

python - 如何使用 rpy2 显示在 python 中创建的热图?

r - 如何平滑R ggplot中的线条

使用 R 中的直接标签库重新排列 ggplot 散点图的标签

r - 更新 data.table 中的多列