R编程:根据一列中的值重复进位另一列中的值

问题描述 投票:0回答:1

在 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 中的任何下一个原始值重叠。

提前致谢。

r function data.table
1个回答
1
投票

我这样做是为了“减少”,只是因为我们事先不知道有多少

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-func
  • 返回的值
  • 在第一次调用内部函数时,
    prev
    x1
    中的现有值(因为
    init=x1
    ),
    ind
    是第一个非零
    w0
    的行号,即3 ` 在这种情况下;
  • 在第二次调用时(如果发生),则
    prev
    是上次调用 anon-func 的值集,因此在
    fifelse
    内,如果行受到影响,则我们传递前一个调用返回的值;
  • prev
    始终表示“从 anon-func 的最后一次调用返回”,除了第一次由
    init=
    ;
  • 填充时除外
  • ind
    始终表示(在本例中)下一个行号,其中
    w0
    不为零。
© www.soinside.com 2019 - 2024. All rights reserved.