【问题标题】:expanding rows using data.table gives error about recycling使用 data.table 扩展行会导致关于回收的错误
【发布时间】:2020-08-01 00:23:19
【问题描述】:

我需要将每人 1 行的数据表扩展为每人可变行的数据表。我知道每个人的确切行数。我一直遇到关于不回收我提供的向量的错误(见下文)。

我似乎不知道如何暂时关闭此功能,或者如何解决它。

示例:

x <- data.table(a = 1:5, b = letters[1:5])
x[, c := 1:a, by = b]

给我下面的错误

Error in `[.data.table`(x, , `:=`(c, 1:a), by = b) : Supplied 2 items to be assigned to group 2 of size 1 in column 'c'. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.

似乎应该允许rep()以外的其他功能。但即使我将其包装在 rep() 中,它似乎也无济于事。

x[, c := rep(1:a, times = 1), by = b]

给出同样的错误。

对于价值,我想要第1行的1个副本,第2行的2个副本,第3行的3个副本等。在实际用例中,要添加的行数(由a列表示) 是基于对一个人的预期行的计算(由 b 列表示)。

是否有一种对 data.table 友好的方式来执行此操作? 提前致谢。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    当输出列的长度与原始列不同时,我们无法分配 (:=)。相反,请将其保存在 list

    x[, .(c = 1:a), by = b][x, on = .(b)]
    

    或者如果只有两列并且有1-1的关系

    x[, .(c = seq(a)), .(b, a)]
    

    【讨论】:

    • 行得通。太感谢了!由于 b 和 a 之间存在 1:1 的关系,因此也只需执行 by = .(b, a) 即可
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2011-02-02
    相关资源
    最近更新 更多