gpt4 book ai didi

r - IF THEN 在带有 LAG 的 r 数据帧上

转载 作者:行者123 更新时间:2023-12-02 02:19:20 25 4
gpt4 key购买 nike

我有一个包含多列的数据框,但有两列对我来说特别有趣。Column1 包含值 0 和一个数字 (>0)Column2 也包含数字。

我想创建 21 个新列,其中包含给定 Column1 的 Column2 中的新信息。

因此,当 Column1 为正数(不是 0)时,我希望第一个新列 Column01 从 Column2 中获取返回 10 的值。 Column02 向后移动 9,.. Column11 与 Column2 值完全相同。.. Column21 向前移动 10。

例如

  Column 1  Column2   Columns01 Columns02.. Columns11..Columns20 Columns21
0 5 0 0 0 0 0
0 2 0 0 0 0 0
0 0 0 0 0 0 0
1 3 0 0 3 5 4
0 10 0 0 0 0 0
0 83 0 0 0 0 0
0 2 0 0 0 0 0
0 5 0 0 0 0 0
0 4 0 0 0 0 0
1 8 0 5 8 5 3
0 6 0 0 0 0 0
0 5 0 0 0 0 0
0 55 0 0 0 0 0
0 4 0 0 0 0 0
2 3 10 83 3 5 0
0 2 0 0 0 0 0
0 3 0 0 0 0 0
0 4 0 0 0 0 0
0 5 0 0 0 0 0
0 3 0 0 0 0 0
1 22 6 5 22 0 0
0 12 0 0 0 0 0
0 0 0 0 0 0 0
0 5 0 0 0 0 0

希望这对您有意义并且可以提供帮助。

最佳答案

这是使用data.table v1.9.5中新实现的shift()函数的一种方法。 :

require(data.table) ## v1.9.5+
setDT(dat) ## (1)
cols = paste0("cols", sprintf("%.2d", 1:21)) ## (2)
dat[, cols[1:10] := shift(Column2, 10:1, fill=0)] ## (3)
dat[, cols[11] := Column2] ## (4)
dat[, cols[12:21] := shift(Column2, 1:10, fill=0, type="lead")] ## (5)
dat[Column1 == 0, (cols) := 0] ## (6)
  1. 假设 dat 是您的data.framesetDT(dat) 将其转换为data.table,通过引用(为了提高效率,数据不会物理复制到内存中的新位置)。

  2. 生成所有列名称。

  3. 生成带有句点 10:1Column2 滞后向量,并将其分配给前 10 列。

  4. 第 11 列 = Column2

  5. 生成带有句点 1:10Column2 前导向量,并将其分配给最后 10 列。

  6. 获取 Column1 == 0 的所有行的索引,并将这些索引的所有新生成的列替换/重置为 0

如果您想要返回data.frame,请使用setDF(dat)

您可以将其包装在具有值 -10:10 的函数中,并选择 type="lag"type="lead" 因此,取决于值是负数还是正数。我将把它留给你。

关于r - IF THEN 在带有 LAG 的 r 数据帧上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29393227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com