沿行传播计算

Propagating calculation along rows


使用以下数据,如何传播 计算依次填入两个NA's.

df <- structure(
  list(
    x = c(0L, 30L, 40L),
    ed0 = c(0.24329772574554,
            NA, NA),
    kd = c(
      -0.0352736803781794,
      -0.0431451671867429,
      -0.0405766219035099
    )
  ),
  .Names = c("x", "ed0", "kd"),
  row.names = c(NA, -3L),
  class = c("tbl_df",
            "tbl", "data.frame")
)

df
#>    x       ed0          kd
#> 1  0 0.2432977 -0.03527368
#> 2 30        NA -0.04314517
#> 3 40        NA -0.04057662

所以第一个 NA 的值是 30 + df$ed0[1] + df$kd[1] 而第二个 NA NA 的值是 40 + df$ed0 [2](在上一步计算)+ df$kd[2]。谢谢。

这是 base R 中一个相当简单的方法。

with(df, cumsum(x + ifelse(is.na(ed0), 0, ed0) + c(0, head(kd, -1))))
[1]  0.2432977 30.2080240 70.1648789

为了分解它,x 保持原样并且 c(0, head(kd, -1)) 设置 kd 的滞后向量,其中初始值为 0。ifelse(is.na(ed0), 0, ed0) 检查 ed0 的每个元素是否为 NA 并替换它如果为 TRUE,则为 0。将这三项相加,并将生成的向量提供给 cumsum 以产生累积和。最后,with用于减少打字。