IF THEN 在具有 LAG 的 r 中的 Dataframe 上

IF THEN on a Dataframe in r with LAG

我有一个包含多列的数据框,但我特别感兴趣的是两列。 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. 生成 Column2 的滞后向量,句点 10:1 并将其分配给前 10 列。

  4. 第 11 列是 = Column2.

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

  6. 获取 Column1 == 0 所在的所有行的索引,以及 replace/reset 为这些索引 0.

    [= 的所有新生成的列57=]

如果你想要 data.frame,请使用 setDF(dat)

你可以用值 -10:10 将其包装在一个函数中,并相应地选择 type="lag"type="lead",具体取决于值是负值还是正值。我会离开对你来说。

一个选项使用base R

cols = paste0("cols", sprintf("%.2d", 1:21)) #copied from @Arun's post
m1 <- matrix(c(rep(0,10), dat1[,2]), nrow=nrow(dat1)+10+1, ncol=21, 
              dimnames=list(NULL, cols))[1:nrow(dat1),]
dat2 <- cbind(dat1,m1*dat1[,1])

注意: 创建 m1 时,会出现警告。

检查@Arun 解决方案的输出(在 运行 'dat' 上的代码之后)

library(data.table)
setDF(dat) #convert the 'data.table' to 'data.frame'
all.equal(dat2, dat, check.attributes=FALSE)
#[1] TRUE

数据

set.seed(24)
dat1 <- data.frame(Column1 = sample(0:1,10, replace=TRUE),
          Column2 = sample(1:5, 10, replace=TRUE))

dat <- copy(dat1)