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)
假设 dat
是您的 data.frame,setDT(dat)
将其转换为 data.table,通过引用(为了提高效率,数据不会物理复制到内存中的新位置)。
生成所有列名。
生成 Column2
的滞后向量,句点 10:1
并将其分配给前 10 列。
第 11 列是 = Column2
.
生成 Column2
的前导向量,句点 1:10
并将其分配给最后 10 列。
获取 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)
我有一个包含多列的数据框,但我特别感兴趣的是两列。 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)
假设
dat
是您的 data.frame,setDT(dat)
将其转换为 data.table,通过引用(为了提高效率,数据不会物理复制到内存中的新位置)。生成所有列名。
生成
Column2
的滞后向量,句点10:1
并将其分配给前 10 列。第 11 列是 =
Column2
.生成
Column2
的前导向量,句点1:10
并将其分配给最后 10 列。获取
[= 的所有新生成的列57=]Column1 == 0
所在的所有行的索引,以及 replace/reset 为这些索引0
.
如果你想要 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)