在 R 中,最好是 data.table,我有以下数据集:
dt1 <- data.table(
w0 = c(0, 0, 3, rep(0, 10)),
x1 = c(0, 0, 1, rep(0, 10)))
我想创建一个新变量 x2,它根据 w0 中的值结转 x1 中的值。
像这样工作的东西:
dt1[, x2 := function(x1, w0)]
这会产生一个如下所示的变量:
dt1[, x2 := c(0, 0, 1, 1, 1, rep(0, 8))]
dt1
仅供参考:“结转”变量 x1 不会与 x1 中的任何下一个原始值重叠。
提前致谢。
我这样做是为了“减少”,只是因为我们事先不知道有多少
w0
会满足条件。
dt1[, x2new := Reduce(function(prev, ind) fifelse(.I %in% (ind + 0:2), x1[ind], prev),
which(w0 != 0), init = x1)]
dt1
# w0 x1 x2 x2new
# <num> <num> <num> <num>
# 1: 0 0 0 0
# 2: 0 0 0 0
# 3: 3 1 1 1
# 4: 0 0 1 1
# 5: 0 0 1 1
# 6: 0 0 0 0
# 7: 0 0 0 0
# 8: 0 0 0 0
# 9: 0 0 0 0
# 10: 0 0 0 0
# 11: 0 0 0 0
# 12: 0 0 0 0
# 13: 0 0 0 0
快速浏览:
which(.)
返回索引列表,如果该列表为空,则仅将 x1
(来自 init=
)通过不变地传递;.I
是所有行号,因此 ind+0:2
表示“非零行和其后的两行”,并且使用 %in%
意味着我们不关心 ind+2
是否多于我们的行数框架;使用 fifelse
,如果在 ind + 0:2
中找到每个行号,则将这些行替换为 x1[ind]
的单个值,否则我们使用之前调用 anon-funcprev
是x1
中的现有值(因为init=x1
),ind
是第一个非零w0
的行号,即3 ` 在这种情况下;prev
是上次调用 anon-func 的值集,因此在 fifelse
内,如果行不受到影响,则我们传递前一个调用返回的值;prev
始终表示“从 anon-func 的最后一次调用返回”,除了第一次由 init=
;ind
始终表示(在本例中)下一个行号,其中 w0
不为零。